HttpURLConnection を使用して複数のスレッドから Web サイトに同時に接続する必要がありましたが、接続ごとに異なる Cookie を使用していました。Java はグローバル CookieManager の設定のみをサポートするため、次のハックを実装しました。
を呼び出す代わりに、スレッドごとに異なるインスタンスを使用CookieHandler.setDefault(new CookieManager())するカスタムを実装しました。これは、各リクエストの後にクリアされます。CookieHandlerCookieStore
のソースコードにSessionCookieManager基づいて呼び出されるクラスを作成しました。CookieManager
メンバー変数は削除され、そのcookieJar使用法は に置き換えられましたgetCookieStore()。
次のコードが追加されました。
public class SessionCookieManager extends CookieHandler {
private final static SessionCookieManager ms_instance = new SessionCookieManager();
public static SessionCookieManager getInstance() {
return ms_instance;
}
private final static ThreadLocal<CookieStore> ms_cookieJars = new ThreadLocal<CookieStore>() {
@Override
protected synchronized CookieStore initialValue() { return new sun.net.www.protocol.http.InMemoryCookieStore(); }
};
public void clear() {
getCookieStore().removeAll();
}
public CookieStore getCookieStore() {
return ms_cookieJars.get();
}
最初のリクエストの前に、カスタムCookieManagerがグローバル デフォルトとして設定されますCookieHandler。
CookieHandler.setDefault(SessionCookieManager.getInstance());
すべてのリクエストの後、現在のスレッドCookieStoreはクリアされます。
try {
...
} finally {
SessionCookieManager.getInstance().clear();
}