我需要使用 HttpURLConnection 同时从多个线程连接到一个网站,但每个连接使用不同的 cookie。由于 Java 仅支持设置全局 CookieManager,因此我实现了以下 hack。
CookieHandler.setDefault(new CookieManager())
我没有调用 ,而是实现了一个自定义,它为每个线程CookieHandler
使用不同的实例,每次请求后都会清除该实例。CookieStore
我创建了SessionCookieManager
基于源代码调用的类CookieManager
。
成员变量已cookieJar
被删除,其用法已替换为getCookieStore()
.
添加了以下代码:
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();
}
在第一次请求之前,自定义CookieManager
设置为全局默认值CookieHandler
:
CookieHandler.setDefault(SessionCookieManager.getInstance());
每次请求后,当前线程CookieStore
都被清除:
try {
...
} finally {
SessionCookieManager.getInstance().clear();
}