[英]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.