问题描述
我需要使用HttpURLConnection同时从多个主题连接到一个网站,但每个连接使用不同的Cookie。因为Java只支持设置一个全局CookieManager,所以我实现了下面的hack。
I needed to connect to a website from multiple threads simultaneously using HttpURLConnection, but use different cookies for each connection. Since Java only supports setting a global CookieManager, I've implemented the following hack.
而不是调用 CookieHandler.setDefault(new CookieManager ,我实现了一个自定义 CookieHandler ,它为每个线程使用不同的 CookieStore 。
Instead of calling CookieHandler.setDefault(new CookieManager()), I've implemented a custom CookieHandler which uses a different CookieStore instance for every thread, which is cleared after each request.
我已经创建了 SessionCookieManager 类,基于 CookieManager 。
I've created class called SessionCookieManager based on the source code of CookieManager.
cookieJar 成员变量已删除,并且其使用已被 getCookieStore()替换。
The cookieJar member variable was removed, and its usage has been replaced by 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 :
Before the first request, the custom CookieManager is set as the global default CookieHandler:
CookieHandler.setDefault(SessionCookieManager.getInstance());
每次请求后,当前线程的 CookieStore 已清除:
After every request, the current thread's CookieStore is cleared:
try { ... } finally { SessionCookieManager.getInstance().clear(); }
推荐答案
直接使用Cookie头,而不是发送cookie。
请参阅cookie标头:,您可以更改每次通话。
One work around would be to use Cookie header directly instead sending the cookie.See cookie header here: https://msdn.microsoft.com/en-us/library/windows/desktop/aa384321(v=vs.85).aspx which you can change every call.
Cookie: <name>=<value> [;<name>=<value>]...
这篇关于如何使用HttpURLConnection和Java中的CookieManager为每个连接使用不同的cookie的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!