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中的行为改变。 一个很久以前编写的客户没有任何抱怨。

Solutions Collecting From Web of "Android WebView阻止从httpsredirect到http"

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