9

我需要使用 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();
}
4

1 回答 1

1

一种解决方法是直接使用 Cookie 标头而不是发送 cookie。请参阅此处的 cookie 标头:https ://msdn.microsoft.com/en-us/library/windows/desktop/aa384321(v=vs.85).aspx ,您可以更改每个呼叫。

Cookie: <name>=<value> [;<name>=<value>]...
于 2015-11-19T07:32:57.817 回答