Android WebView阻止从httpsredirect到http

我有一个解决scheme,我的Android WebView需要首先打开一个https url,然后它将被redirect到一个http url(它可能是从https站点尝试一个http POST)。 这不工作,我的Androiddebugging日志说:

02-20 11:04:45.079 8538-8538 /? E / WebViewCallback:被阻止的URL:[blocked]通过HTTPS加载“ https:// xxx / ”的页面,但是将数据提交到“ http:// yyy ”的不安全位置:该内容也应该被提交HTTPS。

WebView中是否存在允许这种行为的configuration选项?

更多信息:这似乎是Android SDK中的行为改变。 一个很久以前编写的客户没有任何抱怨。

  • 如何使用android webview中的代码发送POST数据
  • webview和本地代码之间的通信在移动应用程序
  • 使用WebView文本select的自定义上下文操作栏
  • 如果在webview中存在触摸事件,则停止触摸事件被ViewPager拦截
  • Android JavascriptInterface安全性?
  • Android webview:像浏览器一样下载文件
  • 离开WebView后如何停止Flash?
  • 在Android WebView中读取键盘事件
  • Lollipop(API 20)中混合http / https内容的默认WebView设置发生了变化。 有关更多详细信息,请参见https://datatheorem.github.io/android/2014/12/20/webviews-andorid-lollipop/

    要允许httpsredirect到http,您需要将混合内容模式设置为MIXED_CONTENT_ALWAYS_ALLOW

    if (Build.VERSION.SDK_INT >= 21) { webview.getSettings().setMixedContentMode( WebSettings.MIXED_CONTENT_ALWAYS_ALLOW ); } 

    请注意,从安全的angular度来看,设置MIXED_CONTENT_ALWAYS_ALLOW是不好的,正如你在答案中注意的那样,最好是在两个站点上都支持https。

    但对于那些无法控制网站的人来说,这应该是有效的。

    您可以通过重写onReceivedSslError()方法来忽略ssl错误。

     @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed(); // Ignore SSL certificate errors } 

    希望这将是你的工作。

    从我的研究中,我不认为有可能禁用此function。 我将在两个站点都支持https。 反正最安全

    它为我工作

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