Android WebView未加载HTTPS URL

sum*_*mit 79 https android webview 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    
}
Run Code Online (Sandbox Code Playgroud)

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

far*_*ath 145

请访问此链接:

将此覆盖方法添加到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
}
Run Code Online (Sandbox Code Playgroud)

这会对你有所帮助.

  • **安全警告**:请注意,这样做完全违背了SSL的目的. (47认同)
  • 谷歌现在向实施上述解决方案的人发送电子邮件:"此电子邮件末尾列出的您的应用程序具有WebViewClient.onReceivedSslError处理程序的不安全实现.具体来说,该实现忽略了所有SSL证书验证错误,使您的应用程序容易受到中间人攻击."具有漏洞的应用程序可能会使用户面临危害,可能会被视为违反内容政策和部分的危险产品4.4开发者分发协议 (27认同)
  • 请不要这样做.它不安全,不允许在Play商店中使用. (5认同)
  • 讨论的最后一个条目工作得很好.非常感谢. (3认同)
  • 任何人都知道如何解决谷歌安全警告,如果是,请告诉我,因为我也面临这个问题. (3认同)
  • ereOn:我不同意。这个评论很有用。它解决了自认证 SSL 证书的问题。我也没有将我的应用上传到谷歌商店。 (2认同)

rob*_*ick 45

根据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
            }

}
Run Code Online (Sandbox Code Playgroud)

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

 mWebView.setWebViewClient(
                new SSLTolerentWebViewClient()
        );
Run Code Online (Sandbox Code Playgroud)

  • 这给出了Google安全警告:WebViewClient.onReceivedSslError处理程序的不安全实现.你知道怎么解决这个问题吗? (2认同)
  • 谷歌在Playstore上将应用程序标记为Unsaif如何在没有ssl的情况下做到这一点? (2认同)

Ana*_*hah 34

要根据新的安全策略正确处理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();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 但谷歌仍然以同样的理由拒绝了我的应用程序。为什么? (3认同)
  • 我按照建议实现了onReceivedSslError回调.应用程序随后成功发布. (2认同)

Kin*_*ses 10

删除它将起作用的下面的代码

 super.onReceivedSslError(view, handler, error);
Run Code Online (Sandbox Code Playgroud)

  • 来自谷歌文档的@ArthTilva:"默认行为是取消加载".通过调用super,您可以调用该默认行为,然后才能访问该方法的其余部分.https://developer.android.com/reference/android/webkit/WebViewClient.html#onReceivedSslError (3认同)

Far*_*ABZ 7

覆盖onReceivedSslError并删除

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

并解决Google安全问题:

setDomStorageEnabled(true);

完整的代码是:

webView.enableJavaScript();
webView.getSettings().setDomStorageEnabled(true); // Add this
webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
webView.setWebViewClient(new WebViewClient(){
        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            // DO NOT CALL SUPER METHOD
            super.onReceivedSslError(view, handler, error);
        }
    });
Run Code Online (Sandbox Code Playgroud)


oza*_*kan 7

复制并粘贴您的代码行兄弟,它会工作相信我:) 我在想,您收到了 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());
Run Code Online (Sandbox Code Playgroud)

  • 如果您这样做(现在是 2019 年 7 月),Google Play 将拒绝您的申请。 (2认同)
  • 将拒绝 2020 年 1 月的 on-words (2认同)

KOT*_*IOS 6

我遵循了上面的答案,但似乎仍然对我不起作用,下面的代码在集成通常是 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在 webview 中执行 post 请求并重定向到支付网关。

设置settings.setDomStorageEnabled(true);对我有用 希望这会有所帮助。

  • 此解决方案完全禁用证书验证,让您容易受到中间人攻击。这是您永远不应该做的事情,尤其是对于支付网关。 (2认同)

Jor*_*sys 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();
            }

        });
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述


Ron*_*nen 5

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

顶行:

import android.webkit.SslErrorHandler;
import android.net.http.SslError;
Run Code Online (Sandbox Code Playgroud)

码:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我是Android新手。我该放在哪里?:) (2认同)