9

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();
}
4

1 に答える 1

1

回避策の 1 つは、Cookie を送信する代わりに Cookie ヘッダーを直接使用することです。ここで Cookie ヘッダーを参照してください: https://msdn.microsoft.com/en-us/library/windows/desktop/aa384321(v=vs.85).aspxこれは、すべての呼び出しを変更できます。

Cookie: <name>=<value> [;<name>=<value>]...
于 2015-11-19T07:32:57.817 に答える