Potrzebowałem połączyć się ze stroną internetową z wielu wątków jednocześnie za pomocą HttpURLConnection, ale dla każdego połączenia używać różnych plików cookie. Ponieważ Java obsługuje tylko ustawienie globalnego CookieManagera, wprowadziłem następujący hack.Jak używać różnych plików cookie dla każdego połączenia za pomocą HttpURLConnection i CookieManager w Javie
Zamiast wywoływania CookieHandler.setDefault(new CookieManager())
, zaimplementowałem niestandardowy CookieHandler
, który używa innej instancji CookieStore
dla każdego wątku, który jest czyszczony po każdym żądaniu.
Stworzyłem klasę o nazwie SessionCookieManager
na podstawie source code z CookieManager
.
Zmienna członkowska cookieJar
została usunięta, a jej użycie zostało zastąpione przez getCookieStore()
.
Poniższy kod dodano:
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 pierwszym zamówienie, zwyczaj CookieManager
jest ustawiony jako globalnego domyślnie CookieHandler
:
CookieHandler.setDefault(SessionCookieManager.getInstance());
po każdym wywołaniu, kasowana jest obecny wątku CookieStore
:
try {
...
} finally {
SessionCookieManager.getInstance().clear();
}
Czy to jest pytanie? Wygląda na to, że wymieniasz to, co zrobiłeś. Czy pytasz, czy to dobry pomysł? Myślę, że tak nie jest. Ten kod nie jest bezpieczny dla wątków. Tylko blokowanie zapewni, że każdy wątek widzi tylko swój zamierzony plik CookieStore. Polecam zamiast tego używanie HttpClient, jeśli możesz. Możesz opublikować recenzję kodu podobną tutaj: http://codereview.stackexchange.com/ –
Zgadzam się, ale dlaczego uważasz, że ten kod nie jest bezpieczny dla wątków? – nivs
źle odczytałem. Nie widzę żadnych problemów z gwintowaniem. Jedynym minusem, jaki widzę, jest to, że musiałeś odwołać się do klasy wewnętrznej Słońca. Czy masz z tym jakiś problem? –