https http 混合访问问题:1、解决android 5.0 webview不能加载http与https混合内容的问题;2、解决浏览器默认是不允许在 https 里面引用 http 资源
解决android 5.0 webview不能加载http与https混合内容的问题
1、解决方法:启用mixed content ,webview默认不允许加载http与https混合内容:
********was loaded over HTTPS, but requested an insecure image********
//webview在安卓5.0之前默认允许其加载混合网络协议内容
// 在安卓5.0之后,默认不允许加载http与https混合内容,需要设置webview允许其加载混合网络协议内容
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
-
MIXED_CONTENT_NEVER_ALLOW:Webview不允许一个安全的站点(https)去加载非安全的站点内容(http),比如,https网页内容的图片是http链接。强烈建议App使用这种模式,因为这样更安全。
-
MIXED_CONTENT_ALWAYS_ALLOW:在这种模式下,WebView是可以在一个安全的站点(Https)里加载非安全的站点内容(Http),这是WebView最不安全的操作模式,尽可能地不要使用这种模式。
-
MIXED_CONTENT_COMPATIBILITY_MODE:在这种模式下,当涉及到混合式内容时,WebView会尝试去兼容最新Web浏览器的风格。一些不安全的内容(Http)能被加载到一个安全的站点上(Https),而其他类型的内容将会被阻塞。这些内容的类型是被允许加载还是被阻塞可能会随着版本的不同而改变,并没有明确的定义。这种模式主要用于在App里面不能控制内容的渲染,但是又希望在一个安全的环境下运行。
2、解决方法:设置WebView接受所有网站的证书
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view,
SslErrorHandler handler, SslError error) {
// TODO Auto-generated method stub
// handler.cancel();// Android默认的处理方式
handler.proceed();// 接受所有网站的证书
// handleMessage(Message msg);// 进行其他处理
}
});
解决浏览器默认是不允许在 https 里面引用 http 资源
1、解决方法:让网站同时准备了 https 资源和 http 资源,通过相对协议的形式访问:
<img src="//domain.com/img/logo.png">
附注:如果是浏览本地文件,浏览器通过file://协议发送请求,导致请求失败,因此本地测试最好是搭建一个本地服务器。
2、解决方法:将http请求转成https请求,添加响应头,设置mate如下:
<meta http-equiv='Content-Security-Policy' content='block-all-mixed-content'>
header("Content-Security-Policy: upgrade-insecure-requests");