Android WebView設置Cookie
場景
最近公司項目需求,要求H5可以直接通過cookie得到相關信息
-
業務場景1:
網頁登錄:記錄用戶登錄信息,下次進去不需要重複登錄
-
業務場景2:
獲取相關參數信息,比如:app版本號等信息
HTTP Cookie管理機制
實現Cookie參數注入,先來了解一下相關的配置
1、domain(host)
表示cookie所在的域,默認爲請求地址
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的domain和path與請求的URL匹配,這個cookie纔是有效的。替換cookie時,要保證替換的Cookie具有相同的 host 、 path、name。
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:生效的持續時間,單位爲秒。
- 若將Cookie的 max-age 設置爲負數,或者 expires 字段設置爲過期時間點,數據庫更新後這條Cookie將從數據庫中被刪除。
- 如果將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;
}
最後,希望此篇博客對大家有所幫助,歡迎提出問題及建議共同探討,如有興趣可以關注我的博客,謝謝!