美文网首页Android
WebView SslError Mixed Content 问

WebView SslError Mixed Content 问

作者: act262 | 来源:发表于2017-08-10 20:24 被阅读196次

    WebView SslError Mixed Content 问题

    Tags: webview


    出现的问题

    WebView 在加载某个地址时发现空白的块(iframe),也就是这块没有加载到
    查看logcat的日志:

    [INFO:CONSOLE(0)] "Mixed Content: The page at 'https://xxx.com' was loaded over HTTPS, but requested an insecure script 'http://player.youku.com/jsapi'. This content should also be served over HTTPS.", source: https://xxx.com/ykplayer
    

    这个页面使用https协议的,内部嵌入了优酷播放器的iframe,而优酷的URL是http协议的,
    也就是https混合http资源等的问题

    解决方案

    • 重写WebViewClient的方法来忽略这类ssl错误
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        // 默认是handle.cancel()的,即遇到错误即中断
        handler.proceed();
    }
    

    设置忽略错误后在API 19 (包括KITKAT_WATCH)以前是可以正常看到内容的了,但在API 21+还是空白的。

    原来是在API 21以前WebSettings#getMixedContentMode默认返回都是WebSettings.MIXED_CONTENT_ALWAYS_ALLOW,在这之后默认是MIXED_CONTENT_NEVER_ALLOW

    所以需要在webview的设置属性中主动设置setMixedContentMode

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

    setMixedContentMode

    /**
     * Configures the WebView's behavior when a secure origin attempts to load a resource from an
     * insecure origin.
     *
     * By default, apps that target {@link android.os.Build.VERSION_CODES#KITKAT} or below default
     * to {@link #MIXED_CONTENT_ALWAYS_ALLOW}. Apps targeting
     * {@link android.os.Build.VERSION_CODES#LOLLIPOP} default to {@link #MIXED_CONTENT_NEVER_ALLOW}.
     *
     * The preferred and most secure mode of operation for the WebView is
     * {@link #MIXED_CONTENT_NEVER_ALLOW} and use of {@link #MIXED_CONTENT_ALWAYS_ALLOW} is
     * strongly discouraged.
     *
     * @param mode The mixed content mode to use. One of {@link #MIXED_CONTENT_NEVER_ALLOW},
     *     {@link #MIXED_CONTENT_ALWAYS_ALLOW} or {@link #MIXED_CONTENT_COMPATIBILITY_MODE}.
     */
    public abstract void setMixedContentMode(int mode);
    

    使用全站https化后最好是全部资源都https化,避免这种混合的情况出现,因为对安全有所影响,所以GooglePlay市场是不允许这个忽略ssl错误的App上架的。这里忽略错误而继续使用时是一些第三方没有https化无奈的做法,也是迫不得已的。

    如果需要考虑安全问题的情况,则要慎重忽略这类错误。

    参考:
    https://stackoverflow.com/questions/28626433/android-webview-blocks-redirect-from-https-to-http
    https://stackoverflow.com/questions/31509277/webview-images-are-not-showing-with-https

    相关文章

      网友评论

        本文标题:WebView SslError Mixed Content 问

        本文链接:https://www.haomeiwen.com/subject/mekkrxtx.html