如何使用HttpURLConnection和Java中的CookieManager为每个连接使用不同的cookie
我需要使用HttpURLConnection从多个线程同时连接到一个网站,但每个连接使用不同的cookie。由于Java只支持设置全局CookieManager,所以我实现了以下hack 我没有调用如何使用HttpURLConnection和Java中的CookieManager为每个连接使用不同的cookie,java,cookies,httpurlconnection,cookiestore,Java,Cookies,Httpurlconnection,Cookiestore,我需要使用HttpURLConnection从多个线程同时连接到一个网站,但每个连接使用不同的cookie。由于Java只支持设置全局CookieManager,所以我实现了以下hack 我没有调用CookieHandler.setDefault(new CookieManager()),而是实现了一个自定义CookieHandler,它为每个线程使用不同的CookieStore实例,每个请求后都会清除该实例 我已经基于CookieManager创建了名为SessionCookieManager
CookieHandler.setDefault(new CookieManager())
,而是实现了一个自定义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();
}
每次请求后,当前线程的CookieStore
将被清除:
try {
...
} finally {
SessionCookieManager.getInstance().clear();
}
一种解决方法是直接使用Cookie头,而不是发送Cookie。 请参阅此处的cookie标题:您可以更改每个调用
Cookie: <name>=<value> [;<name>=<value>]...
Cookie:=[;=]。。。
这是一个问题吗?听起来你好像在列举你所做的事情。你是在问这是不是个好主意?我想不是。此代码不是线程安全的。只有锁定才能确保每个线程只看到其预期的CookieStore。如果可以的话,我建议改用HttpClient。你可能会考虑在这里发布一个类似的代码审查,但是为什么你认为这个代码不是线程安全的?我误读了。我看不到任何线程问题。我看到的唯一负面影响是,您必须引用Sun内部类。你有什么问题吗?我基于此创建了一个完整的HowTo@
Cookie: <name>=<value> [;<name>=<value>]...