繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM