在android的开发中,经常使用webview来显示网页或者h5页面,这是一个跨域的坑。

1.跨域cookie读取

什么是跨域?简单来说就是域名不同。我们都知道,在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();

}