HttpURLConnection を使用して複数のスレッドから Web サイトに同時に接続する必要がありましたが、接続ごとに異なる Cookie を使用していました。Java はグローバル CookieManager の設定のみをサポートするため、次のハックを実装しました。
を呼び出す代わりに、スレッドごとに異なるインスタンスを使用CookieHandler.setDefault(new CookieManager())
するカスタムを実装しました。これは、各リクエストの後にクリアされます。CookieHandler
CookieStore
のソースコードに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();
}