Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android中的cookie管理簡介

Android中的cookie管理簡介

編輯:Android開發教程

Cookie管理是大家在做安卓app中難以避免的問題。我在此發表一些拙見。

先看看cookie可能存放的位置

1.Httpclient會存儲當次請求的cookie內容,存儲位置在 httpClient.getCookieStore 但是apache建議自定義cookie存儲方式,因為cookiestore把cookie放在arraylist裡很容易被系統回收[1]。

2.WebView會存儲cookie在CookieManager,具體使用方式,後續的文章會講這裡不是重點。

正常HttpClient中得Cookie是不能與WebView中得Cookie共享的所以這裡需要一個中間變量(這裡叫做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();

查看本欄目更多精彩內容:http://www.bianceng.cn/OS/extra/

在請求之前,如果要自己在header中setcookie的話那麼就不要保留httpclient中的cookie否則容易造成給服務器提交的request的header中包含兩個cookie的情況,有的會造成服務器混亂。

// 由於自行處理cookie所以要清理client管理的cookie否則容易出現兩個cookie頭的情況

httpClient.getCookieStore().clear();

String strHeader =getCookiesForHttpHeader(context);

request.setHeader(Constant.COOKIE, strHeader);

HttpResponse response = httpClient.execute(request);  

偶爾會碰到api和webview所做的請求在不同域的情況,那麼就要求重新設置cookie的域和path,這裡鼓勵把path范圍設置的大一些否則有些請求比如(ajax,jsonp)可能得不到cookie。

cookieManager.setCookie(url, key + "=" + cookie.getValue() + ";domain=" + "xxxx.com"+";path=/");

下面是當Logout的時候需要做得cookie清理工作,如果使用cookie來判斷是否登錄的話,則只清理本地cookiemap和Preference中得cookie是不夠的。還需要清理掉webview中的對應的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();

希望這篇文章對大家的工作有所幫助。接下來會寫一篇關於httpclient配置的文章。

作者:cnblogs Sharp陳響

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved