Como usar cookies diferentes para cada conexão usando HttpURLConnection e o CookieManager em Java

Eu precisava me conectar a um site a partir de vários segmentos simultaneamente usando o HttpURLConnection, mas use cookies diferentes para cada conexão. Como o Java suporta apenas a configuração de um CookieManager global, eu implementei o seguinte hack.

Em vez de ligarCookieHandler.setDefault(new CookieManager()), Eu implementei um costumeCookieHandler que usa um diferenteCookieStore instância para cada thread, que é limpo após cada solicitação.

Eu criei uma classe chamadaSessionCookieManager baseado noCódigo fonte doCookieManager.

ocookieJar variável de membro foi removida e seu uso foi substituído porgetCookieStore().

O seguinte código foi adicionado:

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 do primeiro pedido, o costumeCookieManager está definido como padrão globalCookieHandler:

CookieHandler.setDefault(SessionCookieManager.getInstance());

Após cada solicitação, o segmento atualCookieStore está desmarcado:

try {
    ...
} finally {
    SessionCookieManager.getInstance().clear();
}

questionAnswers(1)

yourAnswerToTheQuestion