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