如何使用HttpURLConnection和Java中的CookieManager为每个连接使用不同的cookie

如何使用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

我需要使用HttpURLConnection从多个线程同时连接到一个网站,但每个连接使用不同的cookie。由于Java只支持设置全局CookieManager,所以我实现了以下hack

我没有调用
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>]...