簡體   English   中英

Android WebView 未加載 HTTPS URL

[英]Android WebView not loading an HTTPS URL

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 它工作正常。

請訪問此鏈接:

將此覆蓋方法添加到您的 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
}

這會幫助你。

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

為了根據新的安全政策正確處理 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();
}

在此更改后,它將不會顯示警告。

覆蓋 onReceivedSslError 並刪除

super.onReceivedSslError(視圖,處理程序,錯誤)

並解決谷歌安全問題:

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

刪除下面的代碼它將起作用

 super.onReceivedSslError(view, handler, error);

復制並粘貼您的代碼行兄弟,相信我,它會起作用:) 我在想,您收到了 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());

我遵循了上面的答案,但似乎仍然對我不起作用,下面的代碼在集成通常是 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 中執行 post 請求並重定向到支付網關。

設置settings.setDomStorageEnabled(true); 為我做了一個技巧希望這會有所幫助。

要處理 SSL url,請使用 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

在此處輸入圖片說明

要解決 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
    }
}

推薦的方法是

1.不要調用超級方法(從重寫的方法中刪除超級調用)

2.Google 建議在出現任何錯誤時調用SslErrorHandler.cancel()方法

3.不要提示對話框暴露 SSL 錯誤

最好的解決辦法是什么?? 刪除此覆蓋方法

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler,SslError error) {

}

如果您想在 Google Play 商店之外使用 APK,例如,像下面這樣的私有解決方案可能會起作用:

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

如果您想添加額外的可選安全層,您可以嘗試使用證書鎖定 恕我直言,這對於私人或內部使用來說不是必需的。

如果您打算在 Google Play 商店上發布應用程序,那么您應該避免使用 @Override onReceivedSslError(...){...}。 特別是使用 handler.proceed()。 谷歌會找到這個代碼片段並肯定會拒絕你的應用程序,因為使用 handler.proceed() 的解決方案將抑制各種內置安全機制

並且僅僅因為瀏覽器不會抱怨您的 https 連接,這並不意味着 SSL 證書本身是完全可信的!

就我而言, SSL 證書鏈已損壞。 您可以使用SSL Checker或使用SSLLabs來快速測試此類問題。 但請不要問我這是怎么發生的。 我完全沒有頭緒。

無論如何,在重新安裝 SSL 證書后,所有關於“ WebView 中不受信任的 SSL 證書”的所有錯誤最終消失了。 我還刪除了 onReceivedSslError(...) 的 @Override 並刪除了 handler.proceed() ,瞧我的應用程序沒有被 Google Play 商店拒絕(再次)。

我的網站是一個在 angular 8 上開發的子域,它也使用 localstorage 和 cookie。 設置以下行后顯示網站,以及上面提到的其他解決方案。

webSettings.setDomStorageEnabled(true);

設置這兩個屬性足以使其對我有用,並且不會暴露於安全問題:

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

在您的 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);

在清單的應用程序標簽中添加 android:usesCleartextTraffic="true" 一切正常。 這對我有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM