概述
本文主要说明内容如下:
- Cookie值的格式
- Android端WebView如何设置针对特定域名的网址设置cookie值。
Cookie值格式
Cookie是一段小型文本,主要包含一组name-value值和一些公共的可选属性组成,其中可选属性主要包含如下几项:
- Expires属性:设置Cookie的生存周期,该变量可以缺省,当该变量缺省时表示此cookie仅存在在内存中,cookie文件会随着浏览器的关闭而自动消失。
- Path属性:定义了Web Url中采用此Cookie的目录,如果此项值为"/",则表示该域名下的Web服务器均可以访问此cookie文件。
- Domain属性:指定了可以访问此Cookie的Web域名。
-
Secure属性:指定是否以Https安全协议发送cookie。
由此可以看出通过设置Path和Domain可以设置访问cookie网址的有效范围。
设置单个Cookie值
设置cookie主要包含如下几个步骤:
- 设置具体的cookie值和属性
- 判断域名和path,只有对有效的网址才设置cookie
- 设置cookie
设置Cookie字符串
Cookie字符串可以设置为如下格式,主要设置内容包含主要的name-value之外,还有上述的属性:
key=value;domain=.xxx.com;path=/
判断域名和path
获取域名代码示例
private fun getDomain(url: String): String {
var domain = ""
if (!TextUtils.isEmpty(url) && url.startsWith("http")) {
try {
val host = Uri.parse(url).host
if (!TextUtils.isEmpty(host) && host!!.contains(".")) {
domain = host.substring(host.indexOf("."), host.length)
}
} catch (ex: Exception) {
}
}
return domain
}
设置cookie
设置cookie代码示例
private fun setCookie(cookie: String, url: String) {
//设置具体的cookie字符串
if (isDomainTruckerPath(url)) {
var cookieString = cookie + "; domain=" + getDomain(url) + "; path=" + "/"
cookieManager.setAcceptCookie(true)
cookieManager.setCookie(url, cookieString)
}
//同步cookie,21版本之前不许手动同步,21后可以省略flush()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.removeSessionCookies(null)
cookieManager.flush()
} else {
cookieManager.removeSessionCookie()
CookieSyncManager.getInstance().sync()
}
}
注意事项
- Cookie设置必须放在WevSettings设置和webView.loadUrl()方法之前;
- 当Cookie包含了多个键值对信息时,需要多次调用setCookie方法,不能够直接通过直接拼接字符串实现。
- API 21版本之前必须手动同步cookie,因此可以采用版本判断。
- 客户端可以在注销登录时清除该应用程序用到的所有cookies,避免切换账号等操作情景产生缓存问题。如果采用在展示Web的Activity中设置Cookie的方式,需在onDestroy方法中清除Cookie,如下:
cookieManager.removeAllCookie()
备注
此文由本人在网上查询资料后的学习总结,如有错误,欢迎指正。
网友评论