利用HttpURLConnection进行网络请求,需要使用cookie,走了一些弯路,现在的方案是使用cookiemanager。
http://developer.android.com/reference/android/webkit/CookieManager.html
我用的是android.webkit.CookieManager,而不是java.net.CookieManager
参考:
HttpURLConnection与 CookieManager 实现Post提交请求和Cookie管理
先上目前的方案:
1. 在app启动的时候,设置一个cookiemanager的实例
写在APP的oncreate里面:
CookieSyncManager.createInstance(this);
2. 设置,获取
protected String getCookie() {
CookieManager cookieManager = CookieManager.getInstance();
String cookie = cookieManager.getCookie("cookie");
if (cookie != null) {
return cookie;
} else {
return "";
}
}
protected void setCookie(String cookie) {
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setCookie("cookie", cookie);
}
3. 过期按需处理一下
附1:cookie的获取
response.headerFields = conn.getHeaderFields();
setCookies(response.headerFields);
/**
* 存储cookie
* @param headerFields
*/
protected void setCookies(Map<String, List<String>> headerFields) {
if (null == headerFields) {
return;
}
List<String> cookies = headerFields.get(COOKIES_KEY);
if (null == cookies) {
return;
}
for (String cookie : cookies) {
setCookie(cookie);
}
}
COOKIE_KEY="Set-Cookie"
附2:之前的弯路
之前主要是对cookie不理解,以为网络返回什么我就原样存什么,下次再发出去,完全理解错了。
其实每次返回的是"Set-Cokkie",从字面理解,就是设置cookie,并不是完全覆盖,而是它返回的这些cookie是需要重新设置的,而它里面没有返回的cookie则不变。
因此,每次对cookie处理,其实应该只是一个更新部分cookie的过程,而不是将Set-Cokkie中的那些cookie完全取代本地的。
所以,按照我之前的错误理解,每次都将"Set-Cokkie"中的cookie完全覆盖的本地的cookie,将一些不在"Set-Cokkie"中的cookie给清理掉了,所以下次访问的时候,会缺失有用的cookie而导致服务端认证失败