Android WebView未加载HTTPS URL

时间:2011-09-14 12:11:56

标签: android webview https android-webview

public void onCreate(Bundle savedInstance)
{       
    super.onCreate(savedInstance);
    setContentView(R.layout.show_voucher);
    webView=(WebView)findViewById(R.id.webview);
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setBuiltInZoomControls(true);
    String url ="https://www.paymeon.com/Vouchers/?v=%C80%8D%B1x%D9%CFqh%FA%84%C35%0A%1F%CE&iv=%25%EE%BEi%F4%DAT%E1"
    //webView.loadUrl(url); // Not Working... Showing blank
    webView.loadUrl("http://www.yahoo.com"); // its working    
}

当我尝试在WebBView中加载URL时,它只显示一个空白屏幕。如果我加载Google.com或yahoo.com,它运行正常。

15 个答案:

答案 0 :(得分:143)

Please visit this link:

将此覆盖方法添加到WebViewClient实现中。您需要使用Android SDK 2.2(API级别8)或更高版本进行编译。该方法在2.2版(API级别8)的公共SDK中出现,但我们已经在运行2.1,1.6和1.5的设备上进行了测试,它也可以在这些设备上运行(显然行为一直存在)。

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

这会对你有帮助。

答案 1 :(得分:44)

对于fargth的正确答案,以下是一个可能有用的小代码示例。

首先,创建一个扩展WebViewClient的类,并将其设置为忽略SSL错误:

// SSL Error Tolerant Web View Client
private class SSLTolerentWebViewClient extends WebViewClient {

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

}

然后使用您的Web视图对象(在OnCreate()方法中启动),将其Web视图客户端设置为覆盖类的实例:

 mWebView.setWebViewClient(
                new SSLTolerentWebViewClient()
        );

答案 2 :(得分:30)

要根据新的安全策略正确处理SSL证书验证并避免Google拒绝应用程序,只要服务器提供的证书符合您的期望,就更改您的代码以调用SslErrorHandler.proceed(),否则调用SslErrorHandler.cancel()。

例如,我添加了一个警告对话框,以便用户确认并且Google似乎不再显示警告。

    @Override
    public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    String message = "SSL 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?";

        builder.setTitle("SSL Certificate Error");
        builder.setMessage(message);
    builder.setPositiveButton("continue", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.proceed();
        }
    });
    builder.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            handler.cancel();
        }
    });
    final AlertDialog dialog = builder.create();
    dialog.show();
}

更改后,它不会显示警告。

答案 3 :(得分:9)

删除下面的代码

 super.onReceivedSslError(view, handler, error);

答案 4 :(得分:6)

要处理SSL,请从WebViewClient类中获取方法onReceivedSslError(),这是一个示例:

 webview.setWebViewClient(new WebViewClient() {
              ...
              ...
              ...

            @Override
            public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
                String message = "SSL 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 += "\"SSL Certificate Error\" Do you want to continue anyway?.. YES";

                handler.proceed();
            }

        });

您可以在此处查看我的完整示例: https://github.com/Jorgesys/Android-WebView-Logging

enter image description here

答案 5 :(得分:5)

覆盖onReceivedSslError并删除

  

super.onReceivedSslError(视图,处理程序,错误)

要解决Google安全问题:

  

setDomStorageEnabled(真);

完整代码是:

webView.enableJavaScript();
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            // DOT CALL SUPER METHOD
            super.onReceivedSslError(view, handler, error);
        }
    });

答案 6 :(得分:4)

我按照上面的答案但仍然似乎没有为我工作下面的代码为我整合付款通道时通常是https请求:

public class MainActivity extends Activity {

    WebView webView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = (WebView) findViewById(R.id.webView1);
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setDomStorageEnabled(true);
        webView.setWebViewClient(new MyWebViewClient());
        String postData = "amount=1000&firstname=mtetno&email=mttee@gmail.com&phone=2145635784&productinfo=android&surl=success.php"
                + "&furl=failure.php&lastname=qwerty&curl=dsdsd.com&address1=dsdsds&address2=dfdfd&city=dsdsds&state=dfdfdfd&"
                + "country=fdfdf&zipcode=123456&udf1=dsdsds&udf2=fsdfdsf&udf3=jhghjg&udf4=fdfd&udf5=fdfdf&pg=dfdf";
        webView.postUrl(
                "http://host/payment.php",
                EncodingUtils.getBytes(postData, "BASE64"));

    }

    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            webView.loadUrl(url);
            return true;
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler,
                SslError error) {
            handler.proceed();
        }
    }
}

上面的代码是在webview中进行发布请求并重定向到支付网关。

设置settings.setDomStorageEnabled(true);对我来说是一招 希望这会有所帮助。

答案 7 :(得分:4)

要解决Google安全问题,请执行以下操作:

排到最前面的行:

import android.webkit.SslErrorHandler;
import android.net.http.SslError;

代码:

class SSLTolerentWebViewClient extends WebViewClient {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        if (error.toString() == "piglet")
            handler.cancel();
        else
            handler.proceed(); // Ignore SSL certificate errors
    }
}

答案 8 :(得分:1)

复制并粘贴您的代码行bro,请相信我:)我在想,您会收到ssl错误。如果您使用重写onReceivedSslError方法并删除super,则它是super方法。只需编写handler.proceed(),错误就会解决。

    webView.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {

            activity.setTitle("Loading...");
            activity.setProgress(progress * 100);

            if (progress == 100)
                activity.setTitle(getResources().getString(R.string.app_name));
        }
    });

    webView.setWebViewClient(new WebViewClient() {
        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            Log.d("Failure Url :" , failingUrl);
        }

        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            Log.d("Ssl Error:",handler.toString() + "error:" +  error);
            handler.proceed();
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            return true;
        }
    });
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.getSettings().setDomStorageEnabled(true);
    webView.loadUrl(Constant.VIRTUALPOS_URL + "token=" + Preference.getInstance(getContext()).getToken() + "&dealer=" + Preference.getInstance(getContext()).getDealerCode());

答案 9 :(得分:1)

我的网站是一个在 angular 8 上开发的子域,它也使用 localstorage 和 cookie。设置以下行后显示网站,以及上述其他解决方案。

webSettings.setDomStorageEnabled(true);

答案 10 :(得分:0)

推荐的方法将

1. 请勿调用超级方法(从覆盖的方法中删除超级调用)

2.Google建议在出现任何错误时调用 SslErrorHandler.cancel()方法

3. “不提示”对话框公开SSL错误

什么是最佳解决方案?

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,
                               SslError error) {
    if (error.getPrimaryError() != SslError.SSL_UNTRUSTED)
        handler.proceed();
    else
        handler.cancel();

}

答案 11 :(得分:0)

设置这两个属性足以使其对我有用,并且不会出现安全问题:

 WebSettings settings = webView.getSettings();
    settings.setJavaScriptEnabled(true);
    settings.setDomStorageEnabled(true);

答案 12 :(得分:0)

在您的Java代码中使用以下行 webview.getSettings()。setDomStorageEnabled(true)

WebView webView = (WebView) findViewById(R.id.webview);    
webView.getSettings().setDomStorageEnabled(true);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.loadUrl(yourUrl);

答案 13 :(得分:0)

例如,如果您想在Google Play商店外使用APK,则可以采用以下解决方案:

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

如果要添加其他可选的安全层,可以尝试使用certificate pinning。恕我直言,这对于私人或内部使用非常困难。

如果您打算在Google Play商店中发布该应用,则应避免 @Override onReceivedSslError(...){...}。尤其是利用handler.proceed()。 Google会找到此代码段,并肯定会拒绝您的应用,因为使用handler.proceed()的解决方案会抑制各种内置的安全机制< / strong>。

并且仅仅是因为浏览器不会抱怨您的 https连接,并不意味着SSL证书本身就是 完全值得信赖!

就我而言,SSL certificate chain已损坏。您可以使用SSL Checker快速测试此类问题,也可以使用SSLLabs进一步测试此类问题。但是请不要问我这是怎么发生的。我完全不知道。

无论如何,重新安装SSL证书后,有关“ << WebView中任何不受信任的SSL证书”的所有错误最终消失了。 我还删除了onReceivedSslError(...)的@Override并摆脱了handler.proceed(),我的应用évoila再次未被Google Play商店拒绝。

答案 14 :(得分:0)

在清单中的应用程序标签中添加 android:usesCleartextTraffic="true" 一切正常。这对我有用。