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