Jak używać różnych plików cookie dla każdego połączenia za pomocą HttpURLConnection i CookieManager w Javie

Musiałem połączyć się z witryną z wielu wątków jednocześnie za pomocą HttpURLConnection, ale do każdego połączenia używaj różnych plików cookie. Ponieważ Java obsługuje tylko ustawienie globalnego menedżera plików CookieManager, zaimplementowałem następujący hack.

Zamiast dzwonićCookieHandler.setDefault(new CookieManager()), Wprowadziłem zwyczajCookieHandler który używa innegoCookieStore instancja dla każdego wątku, która jest czyszczona po każdym żądaniu.

Stworzyłem klasę o nazwieSessionCookieManager na podstawiekod źródłowy zCookieManager.

ThecookieJar zmienna member została usunięta, a jej użycie zostało zastąpione przezgetCookieStore().

Dodano następujący kod:

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

Przed pierwszą prośbą, zwyczajCookieManager jest ustawiony jako globalny domyślnyCookieHandler:

CookieHandler.setDefault(SessionCookieManager.getInstance());

Po każdym żądaniu bieżący wątekCookieStore jest wyczyszczone:

try {
    ...
} finally {
    SessionCookieManager.getInstance().clear();
}

questionAnswers(1)

yourAnswerToTheQuestion