Avevo bisogno di connettermi a un sito Web da più thread contemporaneamente usando HttpURLConnection, ma usare diversi cookie per ogni connessione. Poiché Java supporta solo l'impostazione di un cookie globale, ho implementato il seguente trucco.Come utilizzare cookie diversi per ogni connessione utilizzando HttpURLConnection e CookieManager in Java
Invece di chiamare CookieHandler.setDefault(new CookieManager())
, ho implementato un numero personalizzato CookieHandler
che utilizza un'istanza diversa CookieStore
per ogni thread, che viene cancellata dopo ogni richiesta.
Ho creato una classe chiamata SessionCookieManager
in base allo source code di CookieManager
.
La variabile membro cookieJar
è stata rimossa e il suo utilizzo è stato sostituito da getCookieStore()
.
è stato aggiunto il seguente codice:
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();
}
Prima della prima richiesta, il costume CookieManager
è impostato come predefinito globale CookieHandler
:
CookieHandler.setDefault(SessionCookieManager.getInstance());
Dopo ogni richiesta, del CookieStore
thread corrente viene cancellato :
try {
...
} finally {
SessionCookieManager.getInstance().clear();
}
Questa è una domanda? Sembra che tu stia elencando quello che hai fatto. Stai chiedendo se questa è una buona idea? Penso che non lo sia. Questo codice non è thread-safe. Solo il blocco garantisce che ogni thread veda solo il suo CookieStore. Consiglio di utilizzare HttpClient, se possibile. Potresti considerare di postare una recensione del codice come questa qui http://codereview.stackexchange.com/ –
D'accordo, ma perché pensi che questo codice non sia sicuro per i thread? – nivs
Ho letto male. Non vedo alcun problema di threading. L'unico aspetto negativo che vedo è che hai dovuto fare riferimento a una classe interna Sun. Stai avendo un problema con esso? –