昨天项目中碰到了一个bug,我们的客户端webview加载了我们的一个新闻详情页,在详情页里面发表一条评论,但是刷新页面后,刚才发表的评论却没有显示在评论列表里。
第一直觉,用其他的浏览器试试这一流程,发现没有问题。
这就奇怪了,难道是webview的设置有问题吗?但是因为不知道新闻评论这个功能的前端后端逻辑,随便修改webview的设置只能是盲人摸象,乱改一通,就算改好了可能也不知道为什么这样改就可以了。
本着科(zhuang)学(bi)的精(yu)神(wang),我先仔细想了想几个可能导致bug的疑点:
- 使用了网页缓存,所以导致没有看到新的评论
- 发表的评论上传失败了
- 请求评论列表出现错误
一开始以为使用的缓存页面,所以没有刷出来评论,可用fiddler抓包发现2个现象:
- 发表评论的时候,ajax请求返回的json,errorcode=0,这说明上传评论是成功的;
- 刷新页面确实重新请求了评论列表,返回的json,errorcode=0,说明请求列表也是成功的,但是居然不包含刚刚发的评论!
抓包可以说明两件事:
- 基本可以排除是本地缓存导致的问题
- 极有可能是后端出了问题
所以找了下后端的开发,了解了下评论逻辑。上传的评论一般都需要审核(人工审核),但是为了能在审核之前让用户可以马上看到自己刚发表的评论(防止以为是个bug),所以在服务端把刚评论的message种到了cookie里面,只要拿到cookie就可以显示出评论了。
然而抓包过程中,并没有发现服务端发送任何cookie,查了很久,终于发现最终的原因:
Apps that target KITKAT or below default to allowing third party cookies. Apps targeting LOLLIPOP or later default to disallowing third party cookies.
在Android 4.4及以下的系统,webview是默认接收第三方cookie的。但是,从android 5.0开始,webview默认是不接受第三方cookie的。
我们的服务端和页面刚好不在同一个域里面,而我的测试机是android 6.0的,所以导致接受不到cookie。
既然知道了根源,也就好解决了,接收第三方cookie的开关是:
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView,true);
}
另外,注意到第一个参数是webview,说明这个设置不是全局的,这一点android官网也做了说明
Allowing third party cookies is a per WebView policy and can be set differently on different WebView instances.
所以,如果新建了一个webview,这个webview默认还是不接收第三方cookie的,这点要特别注意!
感谢您的耐心阅读,以上如果有错误的地方或者理解有失偏颇,请留言指正,谢谢~~