在android的开发中,经常使用webview来显示网页或者h5页面,这是一个跨域的坑。
什么是跨域?简单来说就是域名不同。我们都知道,在pc上,我们使用浏览器访问网址,不同的网址会在本地存储一些cookie信息,从而实现自动登录等功能。在pc上,不同域名无法读取其他域的cookie信息(非Web专业开发者,如有误解请指出)。
但是,在android上的api 23之前,cookies是可以跨域读取的。例如,一个域用userId写一个cookie,一个域可以读取这个值。但是,在23: 00,系统将该值设置为false,因此不再允许跨域读取。如果你的应用有跨域读取需求怎么办?它可以通过以下方式打开:
/* * *设置跨域cookie读取*/
public final void setaccepthirdpartycookies(){
//目标23默认为假,所以手动设置为真
如果(构建。SDK _ INT & gt=构建。版本代码。LOLLIPOP){ cookiemanager . getinstance()。setaccepthirdpartycookies(webView,true);
}?
}
2.http/https混合装载
现阶段很多网站都改https接入了。https可以提高访问网站的安全性,防止信息被窃取。如果所有网页都是https,网页中的链接都是https,就不存在混装的问题(文本区https,图片文件http加载)。但是现阶段很多资源还没有改成https访问,往往页面都嵌入了http链接。这个混合网页不处理,直接加载就不对了。如何解决这个问题?
如果(构建。SDK _ INT & gt=构建。版本代码。棒棒糖){?
web settings . setmixedcontentmode(web settings。MIXED _ CONTENT _ ALWAYS _ ALLOW);
}
这也是一个有不同版本的功能。api23之前的默认值是混合加载,但是到了23: 00,默认值变成了MIXED_CONTENT_NEVER_ALLOW,所以如果需要混合加载,就把setMixedContentMode设置为MIXED_CONTENT_ALWAYS_ALLOW。
3.无法解决跨域访问问题,可以尝试为webview设置如下配置,已经解决了问题;
如果(构建。SDK _ INT & gt= 16) {
Class clazz =webView.getSettings()。getClass();
method method = clazz . get method(" setAllowUniversalAccessFromFileURLs ",boolean . class);
如果(方法!= null) {
method . invoke(webview . get settings(),true);
}
}
} catch(illegalargumentexception){
e . printstacktrace();
} catch(NoSuchMethodException e){
e . printstacktrace();
} catch(IllegalAccessException e){
e . printstacktrace();
} catch(InvocationTargetException e){
e . printstacktrace();
}