如何使用不同的Cookie使用HttpURLConnection类的CookieManager在Ja

2019-07-29 19:39发布

我需要连接到从同时使用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();
}

Answer 1:

一个解决将直接使用Cookie头,而不是发送的cookie。 见饼干头的位置: https://msdn.microsoft.com/en-us/library/windows/desktop/aa384321(v=vs.85).aspx ,你可以改变每个呼叫。

Cookie: <name>=<value> [;<name>=<value>]...


文章来源: How to use different cookies for each connection using HttpURLConnection and the CookieManager in Java