如何管理安卓中的Cookie
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何管理安卓中的Cookie相关的知识,希望对你有一定的参考价值。
参考技术A Cookie在安卓中的使用方式--标示会话,附加信息1.通过Session标示一次会话,举个例子:注册时,判断客户端注册错误次数(注册次数已经超过限制,显示验证码)
2.传递附加数据,举个例子:传递单点登陆的token。
Cookie可能存放的位置--CookieStore,CookieManager
1.Httpclient会存储当次请求的cookie内容,存储位置在
httpClient.getCookieStore
但是Apache建议自定义Cookie存储方式,因为Cookiestore默认把Cookie放在Arraylist里很容易被系统回收,参见[1]。
2.WebView会存储Cookie在CookieManager,具体使用方式,后续的文章会讲这里不是重点。
如何保存Cookie--中间变量,SharedPreference
通常HttpClient中得Cookie不能直接与WebView中得Cookie共享,而且HttpClient中的Cookie需要进一步修改才能给WebView用,所以这里需要一个中间变量(这里叫做CookieMap)来管理Cookie。每次请求的时候都要刷新CookieMap,我推荐的Cookie管理方式是只增加、修改不删除。每次请求完成都要进行一次Cookie同步,如果app要求保持登陆状态的需求,也可以把cookie放入Preference。代码如下:
List<Cookie>
cookieList
=
httpClient.getCookieStore().getCookies();
if
(context
==
null
||
cookieList
==
null
||
cookieList.size()
==
0)
return;
SharedPreferences
preferences
=
context.getSharedPreferences(Constant.HTTPHEAD,
Context.MODE_PRIVATE);
Editor
edit
=
preferences.edit();
for
(Cookie
cookie
:
cookieList)
edit.putString(cookie.getName(),
cookie.getValue());
httpCookiesMap.put(cookie.getName(),
cookie);
edit.commit();
请求前处理Cookie
HttpClient
将Cookie放入CookieStore中
httpClient.getCookieStore().addCookie(cookie)
或者在Request的Header中Setcookie
注意,如果进行此操作,就不要保留httpclient中的Cookie,否则容易造成给服务器提交的Request的Header中包含两个Cookie的情况,会造成有的服务器混乱比如我们的Ngix。
//
由于自行处理cookie所以要清理client管理的cookie否则容易出现两个cookie头的情况
httpClient.getCookieStore().clear();
String
strHeader
=getCookiesForHttpHeader(context);
request.setHeader(Constant.COOKIE,
strHeader);
HttpResponse
response
=
httpClient.execute(request);
WebView
如果Api和Webview所请求的页面在不同于(正常也不会在同一个域),那么就要求重新设置Cookie的域(Domain)和Path,这里鼓励把Path范围设置的大一些否则有些请求比如(Ajax,Jsonp)可能得不到Cookie。
cookieManager.setCookie(url,
key
+
"="
+
cookie.getValue()
+
";domain="
+
"xxxx.com"+";path=/");
清理Cookie
如果使用cookie来判断是否登录的话,则只清理本地CookieMap和SharedPreference中的Cookie是不够的。还需要清理掉WebView中的对应的Cookie和HttpClient中的Cookie。否则下次登陆依然是登陆状态。
//
清理内存cookie
httpCookiesMap.clear();
//
清理httpclientcookie
httpClient.getCookieStore().clear();
//
清理掉WebViewCookie
CookieManager.getInstance().removeAllCookie();
CookieSyncManager.getInstance().sync();
//
清理preferencecookie相关的项目
SharedPreferences
preferences
=
context.getSharedPreferences(Constant.HTTPHEAD,
Context.MODE_PRIVATE);
Editor
editor
=
preferences.edit();
editor.remove(Constant.ACCOUNT);
editor.remove(Constant.NICKNAME);
editor.remove(Constant.phpSESSID);
editor.commit();
Safari 如何管理其 cookie?
【中文标题】Safari 如何管理其 cookie?【英文标题】:How does Safari manage its cookies? 【发布时间】:2011-02-28 01:50:01 【问题描述】:我最近意识到 iOS 中的 Safari 分别为 Safari.app 和其他嵌入 UIWebViews 的应用程序管理 cookie。我之所以得出这样的结论是因为我开发了基于浏览器的应用程序并看到了以下行为:
登录到 Web 服务,然后将会话 ID 设置为 cookie。 当我去 safari 应用程序并访问网络服务时,我被要求重新登录。iOS 中的 Safari 是否真的为 safari 应用和其他基于浏览器的应用分别管理 cookie?
【问题讨论】:
【参考方案1】:是的,你是对的。
每个应用程序都是沙盒,这意味着无法访问任何其他应用程序(Mobile Safari 就是这样)。
因此,在基于浏览器的应用程序中设置的 cookie 不会影响 Mobile Safari 应用程序。
请参阅此问题以了解可能的解决方法(有点):Setting a cookie in an iPhone App
【讨论】:
【参考方案2】:您似乎正在尝试跟踪您的移动应用安装。我建议查看yoz.io,因为它们是免费的,不需要 sdk。
享受;)
【讨论】:
以上是关于如何管理安卓中的Cookie的主要内容,如果未能解决你的问题,请参考以下文章