niv*_*ivs 8 java cookies httpurlconnection cookiestore
我需要使用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();
}
Run Code Online (Sandbox Code Playgroud)
在第一个请求之前,自定义CookieManager设置为全局默认值CookieHandler:
CookieHandler.setDefault(SessionCookieManager.getInstance());
Run Code Online (Sandbox Code Playgroud)
在每个请求之后,当前线程CookieStore被清除:
try {
...
} finally {
SessionCookieManager.getInstance().clear();
}
Run Code Online (Sandbox Code Playgroud)
一种解决方法是直接使用 Cookie 标头而不是发送 cookie。请参阅此处的 cookie 标头:https://msdn.microsoft.com/en-us/library/windows/desktop/aa384321 (v=vs.85).aspx 您可以更改每个调用。
Cookie: <name>=<value> [;<name>=<value>]...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3723 次 |
| 最近记录: |