Android WebView阻止从https重定向到http

时间:2015-02-20 10:13:00

标签: android webview https

我有一个解决方案,我的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中的行为更改。很久以前编译的客户没有任何抱怨。

4 个答案:

答案 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();