url_con = (HttpURLConnection) url.openConnection()
url_con.setRequestProperty("Cookie",cookies)
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"
1.什么是 cookie?cookie 和 token 有何区别?
cookie 是什么呢?cookie 在英语中通常是指饼干,当然,我这里指的不是,而是 HTTP 网络请求中用来记录用户信息的一种数据形式或者说一种机制。
cookie :在客户端发送登录 *** 作的网络请求时,服务器在登陆成功返回的 response header 中会添加一个 set-cookie 的值,作为用户的身份认证,如果是浏览器的话,后面每一次发请求时,浏览器都会自动将之前获取到的 cookie 值插入到 request header 的 cookie 字段中,而且 cookie 本身包括多个属性,比如有效期 expires、域 domain等,因此采用 cookie 的登录机制需要考虑到对 cookie 本身的管理。cookie 主要是在 web 领域使用。
token :相比 cookie,token 令牌的登录机制要更轻,直观的感受是,登录认证成功后,服务器返回 token 值,然后在请求的 url 中拼接一段 “token=%^&%#&%#&” 就完事了,至于什么跨域、安全策略什么的,根本没他什么事,客户端管理 token 也非常简单,只要看好这个字符串就行了,所以 token 一般在移动端用的比较多。当然,移动应用中的 web view 还是要处理 cookie 的。
2.iOS 中的网络请求中如何处理 cookie?
在开始处理 cookie 时,需要了解两个类,NSHTTPCookie 和 NSHTTPCookieStorage,在用的时候要注意几点:
下面切入正题吧,我是如何做的呢?
首先是登录。登录成功后,服务器在 HTTP response header 中的 set-cookie 字段中返回了 cookie 的值,我们可已通过多种方式获取到我们想要的 cookie 值,我是采用了下面这种方式来读取的,因为我们的服务器没有设置 expireDate,所以我就自己做持久化存储了。
然后是请求时添加 cookie 到 request header。实际上这一步系统(NSURLSession / NSURLConnection)已经自动帮我们处理了,具体细节我也不太清楚。
还要考虑重启应用后的 *** 作,由于我们的服务器没有设置 expireDate 以及上面提到的其他原因,在程序重启时,NSHTTPCookieStorage 并不会保存上一次使用应用时的 cookie,所以我们需要在程序启动时读取自己保存的 cookie,同时更新 NSHTTPCookieStorage 的 cookie。
关于 cookie 的有效期处理,在使用 cookie 时需要自己判断 cookie 是否过期,NSHTTPCookieStorage 是不会自动帮我们处理的,更何况我们自己还做了本地存储,所以我们在用到 cookie 时还需要检查 cookie 是否过期,如果过期了,就要废弃掉失效的 cookie。我是在用户的登录状态方法中做的处理:
最后还要记得在退出登录时也要删除 cookie:
3.iOS 中的原生网络请求如何与 webView 实现 cookie 共享?
遗留问题:
1.服务器是在什么时候更新/生成cookie ?
2.登陆成功后,系统是如何自动添加 cookie 到 request header 中去的?
3.服务器是怎么识别客户端的 cookie 的?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)