2012-06-10 10 views
8

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

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/ –

+0

Zgadzam się, ale dlaczego uważasz, że ten kod nie jest bezpieczny dla wątków? – nivs

+0

ź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? –

Odpowiedz

Powiązane problemy