Android WebView設置Cookie

Android WebView設置Cookie

 

場景

最近公司項目需求,要求H5可以直接通過cookie得到相關信息

  • 業務場景1:

    網頁登錄:記錄用戶登錄信息,下次進去不需要重複登錄

  • 業務場景2:

    獲取相關參數信息,比如:app版本號等信息

HTTP Cookie管理機制

實現Cookie參數注入,先來了解一下相關的配置

1、domain(host)

表示cookie所在的域,默認爲請求地址

例如:www.zyb.com/test/index.php

domian默認爲: www.zyb.com

這裏還有跨域問題: 域A: test1.zyb.com 域B: test2.zyb.com

那麼在域A生產一個可以使域A和域B都能訪問的Cookie,就需要將Cookie的domain設置爲.zyb.com;

如果要在域A生產一個令域A不能訪問而域能訪問的Cookie 就要將Cookie設置爲test2.zyb.com。

2、path

表示cookie所在的目錄,定義服務器上的路徑,默認爲/,即根目錄。

同一服務器上的目錄有/test/,/test/aa/,/test/bb/,現設一個cookie1的path爲/test/,cookie2的path爲/test/aa/,那麼test下的所有頁面都可以訪問到cookie1,而/test/、/test/bb/的子頁面不能訪問cookie2,只有/test/aa/的子頁面可以訪問cookie2。

這是因爲cookie只允許其path路徑下的頁面訪問。

因此一般如果訪問一級域名,只需要將path設置爲根目錄就可以。

3、Set-Cookie響應頭格式

Set-Cookie: <name>=<value>[; <name>=<value>]...
   [; expires=<date>][; domain=<domain_name>]
   [; path=<some_path>][; secure][; httponly]

如果出現Cookie偶爾失效是什麼原因呢?

只有cookie的domainpath與請求的URL匹配,這個cookie纔是有效的。替換cookie時,要保證替換的Cookie具有相同的 host 、 pathname

Cookie 默認保存位置

如果項目中使用WebView,自動將Cookie保存在本地數據庫中。保存位置:data/data/package_name/app_WebView/Cookies.db

Cookie保存位置

cookie內容

如何設置

  • 針對項目中 一級域名 設置cookie
/**
 * 同步cookie
 *
 * @param url 地址
 * @param cookieList 需要添加的Cookie值,以鍵值對的方式:key=value
 */
private void syncCookie (String url, ArrayList<String> cookieList) {
    CookieSyncManager.createInstance(context);
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    if (cookieList != null && cookieList.size() > 0) {
        for (String cookie : cookieList) {
                cookieManager.setCookie(url, cookie);
        }
    }
    cookieManager.setCookie(url, "Domain="+url);
    cookieManager.setCookie(url, "Path=/");
    String cookies = cookieManager.getCookie(url);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        cookieManager.flush();
    } else {
        CookieSyncManager.getInstance().sync();
    }
}

這裏的url指的是一級域名,比如:.zyb.com

  • 自定義Cookie值
private static DOMAIN = ".zyb.com"
private void setAppInfoCookies () {
    ArrayList<String> cookieList = new ArrayList<>();
    cookieList.add("site=android");
    cookieList.add("wak_version=" + getAppVersion);
    syncCookie(DOMAIN, cookieList);
}
  • 相關參數說明

CookieSyncManager 是個過時的類,Api21 中 WebView 可以自動同步。

CookieSyncManager.getInstance().sync(); 方法的替代方法是 cookieManager.flush();

注意: 如果更新Cookie,只有host、name、path都相同時纔會更新成功,否則只會在數據庫中新添加。

Cookie的過期機制

可以設置Cookie的生效時間字段名爲: expires 或 max-age

expires:過期的時間點

max-age:生效的持續時間,單位爲秒。
  1. 若將Cookie的 max-age 設置爲負數,或者 expires 字段設置爲過期時間點,數據庫更新後這條Cookie將從數據庫中被刪除。
  2. 如果將Cookie的 max-age 和 expires 字段設置爲正常的過期日期,則到期後再數據庫更新時會刪除該條數據。

JS獲取Cookies

function getCookie(cookie_name) {
        //獲取所有的cookie
        var allcookies = document.cookie;
        //索引長度,開始索引的位置
        var cookie_pos = allcookies.indexOf(cookie_name);

        // 如果找到了索引,就代表cookie存在,否則不存在
        if (cookie_pos != -1) {
            // 把cookie_pos放在值的開始,只要給值加1即可
            //計算取cookie值得開始索引,加的1爲“=”
            cookie_pos = cookie_pos + cookie_name.length + 1; 
            //計算取cookie值得結束索引
            var cookie_end = allcookies.indexOf(";", cookie_pos);
            
            if (cookie_end == -1) {
                cookie_end = allcookies.length;
            }
            //得到想要的cookie的值
            var value = unescape(allcookies.substring(cookie_pos, cookie_end)); 
        }
        return value;
}

最後,希望此篇博客對大家有所幫助,歡迎提出問題及建議共同探討,如有興趣可以關注我的博客,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章