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

我需要使用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 ms_cookieJars = new ThreadLocal() { @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/en-us/library/windows/desktop/aa384321(v = vs.85).aspx ,您可以更改每次通话。

 Cookie: = [;=]...