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

Respuestas a la pregunta(1)

Su respuesta a la pregunta