最近在做项目时用到了webview打开指定链接的网页,可已经把webview设置了cookie但始终跳转到登录页面,这明显是cookie没有设置成功导致webview没有将设置好的cookie发送出去……
1
2
3
4
5
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(url, cookies);//cookies是在HttpClient中获得的cookie
CookieSyncManager.getInstance().sync();
通过上述代码即可把事先保存下来的cookie和指定的url关联起来,达到保持登录的状态,避免重复登录。遗憾的是,笔者在开发过程当中严格按照上述设置cookie的代码来进行cookie的设置,可结果还是失败,始终跳转到登录页提示登录。后来返回去查看了下Android API文档,发现setCookie函数的两个参数值说明如下:
public void setCookie(String url, String value)
Added in API level 1
Sets a cookie for the given URL. Any existing cookie with the same host, path and name will be replaced with the new cookie. The cookie being set must not have expired and must not be a session cookie, otherwise it will be ignored.
url the URL for which the cookie is set
value the cookie as a string, using the format of the 'Set-Cookie' HTTP response header
value参数的作用是cookie值的字符串形式,但格式一定要是http请求头格式"Set-Cookie"。
api文档里的这句话突然让我惊醒,于是经过百度我查到了cookie的格式相关的文章,现摘抄如下:
原文链接:http://www.cnblogs.com/hdtianfu/archive/2013/05/30/3108295.html
Cookie相关的Http头
有连个Http头部和Cookie有关:Set-Cookie和Cookie。
Set-Cookie由服务器发送,它包含在响应请求的头部中。它用于在客户端创建一个Cookie
Cookie头由客户端发送,包含在HTTP请求的头部中。注意,只有cookie的domain和path与请求的URL匹配才会发送这个cookie。
Set-Cookie Header
Set-Cookie响应头的格式如下所示:
Set-Cookie: =[; =]...
[; expires=][; domain=]
[; path=][; secure][; httponly]
expires=: 设置cookie的有效期,如果cookie超过date所表示的日期时,cookie将失效。
如果没有设置这个选项,那么cookie将在浏览器关闭时失效。
注意:date是格林威治时间(GMT),使用如下格式表示:
DAY, DD MMM YYYY HH:MM:SS GMT
DAY
The day of the week (Sun, Mon, Tue, Wed, Thu, Fri, Sat).
DD
The day in the month (such as 01 for the first day of the month).
MMM
The three-letter abbreviation for the month (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec).
YYYY
The year.
HH
The hour value in military time (22 would be 10:00 P.M., for example).
MM
The minute value.
SS
The second value.
domain= :
path=:
注:临时cookie(没有expires参数的cookie)不能带有domain选项。
当客户端发送一个http请求时,会将有效的cookie一起发送给服务器。
如果一个cookie的domain和path参数和URL匹配,那么这个cookie就是有效的。
一个URL中包含有domain和path,可以参考http://www.w3school.com.cn/html/html_url.asp
secure : 表示cookie只能被发送到http服务器。
httponly : 表示cookie不能被客户端脚本获取到。
在程序中生成expires
C的方式
time_t curTime = time(NULL);
tm * gmTime = gmtime(&curTime);
char strExperis[50];
strftime(strTimeBuf, 100, " %a, %d %b %Y %X GMT;", gmTime);
JavaScript的方式
var d = new Date();
var expires = d.toGMTString();
上述红色加粗的文字更让我确信了我的判断,此时此刻的心情有多么激动就不用说了,嘿嘿
于是,我在原来设置的cookie字符串上加上了domain和path字段,怀着期盼的心情run了下,哈哈,结果正确了,再也不用反复登录了。
分享到:
相关推荐
所以往往需要将在native方法...这种情况在Android开发中比较常见,因为Android不会自动同步cookie到WebView。做iOS开发则不用担心这个问题,因为iOS内部已经实现了cookie同步.本文就是一个小的事例,从登录到同步cookie
原生登录cookie保持提供webview使用
使用android studio 3.1.2 ,利用webview,实现登录界面。采用本地html 页面
Android使用WebView加载登录的html界面,则通过登录成功获取Cookie并同步,可以是下一次不用登录也可以查看到个人信息,注:如果初始化加载登录,可通过缓存Cookie信息来验证是否要加载登录界面。Cookie信息包含了你...
Android-X5WebView基本封装和使用 通过OkHttp拦截器、自定义CookieJar有效完成客户端与H5端的Cookie同步管理 监听WebView的加载进度 滚动条的设置(隐藏或者显示,内侧显示还是外侧显示) 优化X5WebView的预加载问题...
iOS Cookie WebView 自动登录
Android8.0以下手机自带的android-system-webview版本过低使用
。。。。。。。Android webview QQ一键登录并向后台返回参数
httpClient请求和服务器session保持同步,webView对cookie的管理
Android WebView 去除标题 利用javacript交互
这是AOSP的webview,包名com.android.webview,不是google的webview
Android 基于x5Webview 浏览文件 office文档 已测试Android11 功能实现
1.本文采用的是android调用assest中的本地.html文件,webview展示(加载网络的html效果是一样的,把url替换掉就行) 2.包含本地.html文件加载,点击.html控件,Android端响应 3.包含本地.html文件加载,点击.html...
Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...
Android Webview 滑动监听 放大缩小查看网页图片
android webview拨打电话 关注博客http://himici.com
Android Webview虽然提供了页面加载及资源请求的钩子,但是对于h5的ajax请求并没有提供干涉的接口,这意味着我们不能在webview中干涉javascript发起的http请求,而有时候我们确实需要能够截获ajax请求并实现一些功能...
android端通用WebView
Android实现WebView懒加载,提前进行页面JS资源加载。减少WebView加载时间及加载资源问题。Android 8.0以前需要引入X5内核,Android 8.0以后无特殊要求。
android 8.0 webview 拍照、预览、二维码扫描比较完整的例子,对于权限检查控制,有比较完善的提示写法。可以下载后,直接在android studid上运行,编译版本和target版本均是SDK android 8.0,最低版本设置成了...