[英]Should HttpURLConnection with CookieManager automatically handle session cookies?
[英]How to use different cookies for each connection using HttpURLConnection and the CookieManager in Java
我需要使用HttpURLConnection从多个线程同时连接到网站,但是每个连接使用不同的cookie。 由于Java仅支持设置全局CookieManager,因此我实现了以下技巧。
我没有调用CookieHandler.setDefault(new CookieManager())
,而是实现了一个自定义CookieHandler
,该自定义CookieHandler
为每个线程使用一个不同的CookieStore
实例,该实例在每次请求后都会清除。
我已经基于CookieManager
的源代码创建了一个名为SessionCookieManager
的类。
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();
}
一种解决方法是直接使用Cookie标头,而不是发送Cookie。 在此处查看Cookie标头: https : //msdn.microsoft.com/zh-cn/library/windows/desktop/aa384321(v=vs.85).aspx ,您可以更改每个呼叫。
Cookie: <name>=<value> [;<name>=<value>]...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.