Cómo usar diferentes cookies para cada conexión usando HttpURLConnection y el CookieManager en Java
Necesitaba conectarme a un sitio web desde varios subprocesos simultáneamente utilizando HttpURLConnection, pero utilizaba diferentes cookies para cada conexión. Ya que Java solo admite la configuración de un CookieManager global, implementé el siguiente truco.
En lugar de llamarCookieHandler.setDefault(new CookieManager())
, He implementado una costumbreCookieHandler
que utiliza un diferenteCookieStore
instancia para cada hilo, que se borra después de cada solicitud.
He creado una clase llamadaSessionCookieManager
basado en elcódigo fuente deCookieManager
.
loscookieJar
La variable miembro fue eliminada, y su uso ha sido reemplazado porgetCookieStore()
.
Se agregó el siguiente código:
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();
}
Antes de la primera solicitud, la costumbre.CookieManager
se establece como el predeterminado globalCookieHandler
:
CookieHandler.setDefault(SessionCookieManager.getInstance());
Después de cada solicitud, el hilo actual deCookieStore
se borra:
try {
...
} finally {
SessionCookieManager.getInstance().clear();
}