我有一个解决方案,我的Android WebView需要首先打开一个https网址,然后它会被重定向到一个http网址(它可能是从https网站尝试一个http POST)。这不起作用,我的Android调试日志说:
02-20 11:04:45.079 8538-8538 /? E / WebViewCallback:屏蔽网址:[已屏蔽]' https://xxx/'是通过HTTPS加载的,但是将数据提交到“http://yyy”的不安全位置:此内容也应通过HTTPS提交。
WebView中是否有允许此行为的配置选项?
更多信息:它似乎是Android SDK中的行为更改。很久以前编译的客户没有任何抱怨。
答案 0 :(得分:30)
Lollipop(API 20)中混合的http / https内容的默认WebView设置发生了变化。有关详细信息,请参阅https://datatheorem.github.io/android/2014/12/20/webviews-andorid-lollipop/。
要允许https重定向到http,您需要将混合内容模式设置为MIXED_CONTENT_ALWAYS_ALLOW
if (Build.VERSION.SDK_INT >= 21) {
webview.getSettings().setMixedContentMode( WebSettings.MIXED_CONTENT_ALWAYS_ALLOW );
}
请注意,从安全角度来看,设置MIXED_CONTENT_ALWAYS_ALLOW是不好的,正如您在答案中所述,最好在两个站点上都支持https。
但对于那些无法控制网站的人来说,这应该可行。
答案 1 :(得分:4)
您可以通过覆盖onReceivedSslError()方法来忽略ssl错误。
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed(); // Ignore SSL certificate errors
}
希望它对你有用。
答案 2 :(得分:0)
根据我的研究,我不认为可以禁用此功能。我将在两个站点中支持https。无论如何最安全。
答案 3 :(得分:-1)
它为我工作
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.webView.getContext());
AlertDialog alertDialog = builder.create();
String message = "Certificate error.";
switch (error.getPrimaryError()) {
case SslError.SSL_UNTRUSTED:
message = "The certificate authority is not trusted.";
break;
case SslError.SSL_EXPIRED:
message = "The certificate has expired.";
break;
case SslError.SSL_IDMISMATCH:
message = "The certificate Hostname mismatch.";
break;
case SslError.SSL_NOTYETVALID:
message = "The certificate is not yet valid.";
break;
}
message += " Do you want to continue anyway?";
alertDialog.setTitle("SSL Certificate Error");
alertDialog.setMessage(message);
alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d("CHECK", "Button ok pressed");
// Ignore SSL certificate errors
handler.proceed();
}
});
alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Log.d("CHECK", "Button cancel pressed");
handler.cancel();
}
});
alertDialog.show();