@David的回答是最好的。最容易维护一个本地CookieManager,手动将数据写入和读取与此cookie管理器相关联的cookie存储中。
以下代码将响应中的Cookies加载到cookie管理器中:
public static void loadResponseCookies(@Nullable HttpURLConnection conn,@Nullable CookieManager cookieManager) {
if (cookieManager == null || conn == null){
return;
}
List<String> cookiesHeader = conn.getHeaderFields().get(COOKIES_HEADER);
if (cookiesHeader != null) {
for (String cookieHeader : cookiesHeader) {
List<HttpCookie> cookies;
try {
cookies = HttpCookie.parse(cookieHeader);
} catch (NullPointerException e) {
log.warn(MessageFormat.format("{0} -- Null header for the cookie : {1}",conn.getURL().toString(), cookieHeader.toString()));
continue;
}
if (cookies != null) {
Debug("{0} -- Reading Cookies from the response :", conn.getURL().toString());
for (HttpCookie cookie : cookies) {
Debug(cookie.toString());
}
if (cookies.size() > 0) {
cookieManager.getCookieStore().add(null, HttpCookie.parse(cookieHeader).get(0));
}
}
}
}
}
这段代码将 HttpUrlConnection 对象与 cookie 管理器相关联的 cookies 填充:
public void populateCookieHeaders(HttpURLConnection conn) {
if (this.cookieManager != null) {
List<HttpCookie> cookies = this.cookieManager.getCookieStore().getCookies();
if (cookies != null) {
if (cookies.size() > 0) {
Debug("{0} -- Adding Cookie Headers : ", url.toString());
for (HttpCookie cookie : cookies) {
Debug(cookie.toString(), null);
}
conn.setRequestProperty(COOKIE_REQUEST_HEADER, StringUtils.join(cookies, ";"));
}
}
}
}
这是处理cookie最安全的方式。
我尝试使用了threadlocal cookiestore和CookieManager的扩展。但是这两种方法都不适用于我的情况。
TextUtils.join(";", msCookieManager.getCookieStore().getCookies()));
- Reafidy