如何使用cookieManager在httpUrlConnection中处理cookie
我有一个服务器请求返回多个cookie,如下所示:
这就是我将这些cookie存储到cookieManager的方式:
HttpURLConnection connection = ... ; static java.net.CookieManager msCookieManager = new java.net.CookieManager(); msCookieManager.put(COOKIES_URI, connection.getHeaderFields());
这就是我将这些cookie添加到下一个连接的方式:
connection.setRequestProperty("Cookie", msCookieManager.getCookieStore().get(COOKIES_URI).toString());
是从cookieManager获取cookie的正确方法吗?我确信有更好的一个…
好吧,正确的做法就是这样:
从响应头获取Cookie并将其加载到cookieManager中:
static final String COOKIES_HEADER = "Set-Cookie"; HttpURLConnection connection = ... ; static java.net.CookieManager msCookieManager = new java.net.CookieManager(); Map<String, List<String>> headerFields = connection.getHeaderFields(); List<String> cookiesHeader = headerFields.get(COOKIES_HEADER); if (cookiesHeader != null) { for (String cookie : cookiesHeader) { msCookieManager.getCookieStore().add(null,HttpCookie.parse(cookie).get(0)); } }
从CookieManager获取Cookie并将其加载到连接中:
if (msCookieManager.getCookieStore().getCookies().size() > 0) { // While joining the Cookies, use ',' or ';' as needed. Most of the servers are using ';' connection.setRequestProperty("Cookie", TextUtils.join(";", msCookieManager.getCookieStore().getCookies())); }
我一直在寻找/尝试几天来解决我的问题:即使login成功后,仍然无法访问受保护的Web资源
我在iOS上创build了相同的应用程序,并没有相同的问题,因为NSUrlConnection在我们后面为我们做了cookie维护。 在Android上,我尝试手动添加cookie
connection.setRequestProperty("Cookie", "PHPSESSID=str_from_server")
没有任何运气。
最后我读了这个
并在我的应用程序的开始处添加了以下两行:
CookieManager cookieManager = new CookieManager(); CookieHandler.setDefault(cookieManager);
现在一切正常。
大卫的回答是最好的。 最容易维护一个本地的CookieManager,并手动写入和从与这个cookiepipe理器关联的cookie存储读取。
此代码将来自响应的Cookie加载到Cookiepipe理器中:
/** * Gets Cookies from the response header and loads them into cookie manager * * @param conn instance of {@link HttpURLConnection} object * @param cookieManager the cookie manager({@link CookieManager} instance) in which the cookies are to be loaded<p>In case a null object is passed, the function will not perform any action and return back to the caller. </p> */ public static void loadResponseCookies(@Nullable HttpURLConnection conn,@Nullable CookieManager cookieManager) { //do nothing in case a null cokkie manager object is passed 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())); //ignore the Null cookie header and proceed to the next cookie header 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)); } } } } }
此代码使用与Cookiepipe理器关联的Cookie填充HttpUrlConnection对象:
public void populateCookieHeaders(HttpURLConnection conn) { if (this.cookieManager != null) { //getting cookies(if any) and manually adding them to the request header 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); } //adding the cookie header conn.setRequestProperty(COOKIE_REQUEST_HEADER, StringUtils.join(cookies, ";")); } } } }
这是处理cookie的最安全的线程方式。
我尝试使用一个threadlocal的cookiestore和CookieManager的扩展。 这两种方法都不适用于我的情况。
接受的答案可能有效,但我find了一个更简单的解决scheme。 金拇指的解决scheme在我的情况下不起作用。 看到我的答案连接webView&httpUrlConnection
使用java.net.HttpURLConnection
和groovy,只需使用URLConnection#addRequestProperty(String key, String value)
添加URLConnection#addRequestProperty(String key, String value)
。
import java.net.HttpURLConnection HttpURLConnection createRequest(String chatRequestBody) { HttpURLConnection httpChatRequest = new URL("${endpoint}").openConnection() as HttpURLConnection httpChatRequest.with { doOutput = true requestMethod = 'POST' //headers addRequestProperty("Content-Type", "application/json") addRequestProperty("Client-Platform", "android") //cookies addRequestProperty("Cookie", "cookie_key1=cookie_value1,cookie_key2=cookie_value2") getOutputStream().write(chatRequestBody.getBytes("UTF-8")) } httpChatRequest }