如何管理安卓中的Cookie

如何管理安卓中的Cookie,第1张

Cookie管理是大家在做安卓app开发中难以避免的问题。我在此发表一些关于Cookie管理的拙见。

Cookie是什么

Cookie最重要的作用是会话识别(SeesionId)和状态长期保持(在浏览器保存需要长期保持的数据)。

注意,这些工作并不是必须通过Cookie进行,也可以约定提交数据格式和提交数据格式,固定其中附加数据字段来替代Cookie。但是不推荐这么做,因为如果涉及到与WebView交互,就需要把Json中得数据转化成Cookie,会增加不必要的工作量和犯错的几率。而且HttpClient提供了这个工具,很完善,为什么不用呢。

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()

1.获取

finalHttp = new FinalHttp()

finalHttp.post(API.server, ajaxParams, new AjaxCallBack<String>() {

@Override            public void onFailure(Throwable t, int errorNo, String strMsg) {                super.onFailure(t, errorNo, strMsg)

closeProgressDialog()

prompt(getResources().getString(R.string.request_time_out))

System.out.println("errorNo:" + errorNo + ",strMsg:" + strMsg)

}

@Override            public void onStart() {                super.onStart()

showProgressDialog(getResources().getString(R.string.loading))

}

@Override            public void onLoading(long count, long current) {                super.onLoading(count, current)

}

@Override            public void onSuccess(String t) {                super.onSuccess(t)               //从服务器获取CookieStore,保存到MyCookieStore

DefaultHttpClient client=(DefaultHttpClient)finalHttp.getHttpClient()

MyCookieStore.cookieStore = client.getCookieStore()               if (!StringUtils.isBlank(t)) {

Log.e(TAG, Constant.RESULT + API.GET_VERIFY_CODE + "\n" + t.toString())

JSONStatus jsonStatus = BaseJSONData(t)                   if (jsonStatus.isSuccess) {

handler.sendMessage(handler.obtainMessage(GET_VERIFY_CODE_SUCCESS, BaseJSONData(t)))

} else {

handler.sendMessage(handler.obtainMessage(GET_VERIFY_CODE_FALSE, BaseJSONData(t)))

}

} else {

prompt(getResources().getString(R.string.request_no_data))

}

}

})

2.设置

Override    public void initData() {        finalHttp = new FinalHttp()        //配置已保存的CookieStore,保证处于同一session中请求        finalHttp.configCookieStore(MyCookieStore.cookieStore)        finalHttp.post(API.server,  ajaxParams, new AjaxCallBack<String>() {                        ......(省略)        }}

格式不行,凑合看吧

点赞+关注谢谢


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11339405.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存