HttpURLConnection使用cookie

利用HttpURLConnection进行网络请求,需要使用cookie,走了一些弯路,现在的方案是使用cookiemanager。

http://developer.android.com/reference/android/webkit/CookieManager.html

我用的是android.webkit.CookieManager,而不是java.net.CookieManager

参考:

android 给url添加cookie

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> headerFields) {
	if (null == headerFields) {
		return;
	}
	List 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而导致服务端认证失败






你可能感兴趣的:(Android)