WebViewClient::onReceivedSslError 未被调用

WebViewClient::onReceivedSslError is not called

我已将我的 WebViewClient 实现附加到我的 WebView。

appView.setWebViewClient(new AppViewClient());

我的 onReceivedSslErroronReceivedError 实现被调用时出现了除 Mixed Content 错误之外的所有预期错误。

我对这两种方法的实现:

Log.i(TAG, "Error Cought");

正如我所说,它们会在出现 Mixed Content 错误以外的各种错误时被调用。我的请求在没有调用这两种方法的情况下被阻止。

您使用的是哪个 API 版本? 默认情况下,允许 MIX CONTENT 在 21 之前。

您可以尝试在网络视图中添加此设置:

webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_NEVER_ALLOW);

API 21 级以下:

try {
    Method m = WebSettings.class.getMethod("setMixedContentMode", int.class);
    if ( m != null ) {

     m.invoke(webView.getSettings(), 1); //MIXED_CONTENT_NEVER_ALLOW

    }
}
catch (Exception ex) {

}

很高兴知道您已经了解 MixedContentMode :) 我可以 建议尝试两件事。

  1. 使用控制台消息来识别此错误。您可以进行字符串匹配来检查 MIX CONTENT 错误。
myWebView.setWebChromeClient(new WebChromeClient() {
  public void onConsoleMessage(String message, int lineNumber, String sourceID) {
    Log.d("MyApplication", message + " -- From line "
                         + lineNumber + " of "
                         + sourceID);
  }
});
  1. 拦截请求并检查url。检查 source code.

    中的 WebActivity 实现
    mWebView.setWebViewClient(new WebViewClient() {
                @Override
                public WebResourceResponse shouldInterceptRequest(WebView view,
                        WebResourceRequest request) {
                    String url = request.getUrl().toString();
                    if (!URLUtil.isHttpsUrl(url)) {
                        Logger.loge("Secure connection required, but insecure URL requested "
                                + "explicitly, or as a part of the page.");
                        return createNewSecurityErrorResponse();
                    }
                    return super.shouldInterceptRequest(view, request);
                }
            });
    
    
    
    
    private WebResourceResponse createNewSecurityErrorResponse() {
            WebResourceResponse response = new WebResourceResponse("text/plain", "UTF-8", null);
            response.setStatusCodeAndReasonPhrase(HTTP_FORBIDDEN, "Secure connection required");
            return response;
        }