我需要连接到从同时使用HttpURLConnection的多线程网站,但使用不同的Cookie为每个连接。 由于Java只支持设置全局CookieManager,我已经实现了下面的技巧。
而不是调用的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();
}