2015-02-20 26 views
8

Tôi có một giải pháp nơi AndroidView của tôi cần phải mở url https lần đầu tiên, sau đó nó sẽ được chuyển hướng đến một địa chỉ http (có thể thử một POST http từ trang https). Tính năng này không hoạt động và nhật ký gỡ lỗi Android của tôi cho biết:Android WebView chặn chuyển hướng từ https đến http

02-20 11: 04: 45.079 8538-8538 /? E/WebViewCallback ﹕ URL bị chặn: [bị chặn] Trang tại 'https://xxx/' đã được tải qua HTTPS, nhưng đang gửi dữ liệu đến vị trí không an toàn tại 'http://yyy': nội dung này cũng phải được gửi qua HTTPS.

Có bất kỳ tùy chọn cấu hình nào trong WebView cho phép hành vi này không?

Thông tin thêm: có vẻ như thay đổi hành vi trong SDK Android. Một khách hàng đã biên soạn một thời gian dài trước đây làm điều này mà không có bất kỳ khiếu nại.

Trả lời

25

Có thay đổi về cài đặt WebView mặc định cho nội dung http/https hỗn hợp trong Lollipop (API 20). Xem https://datatheorem.github.io/android/2014/12/20/webviews-andorid-lollipop/ để biết thêm chi tiết.

Để cho phép https để chuyển hướng đến http bạn cần phải thiết lập các chế độ nội dung hỗn hợp để MIXED_CONTENT_ALWAYS_ALLOW

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

Lưu ý rằng việc thiết MIXED_CONTENT_ALWAYS_ALLOW là xấu từ điểm về bảo mật, và như bạn lưu ý trong câu trả lời của bạn, nó là tốt hơn để hỗ trợ https trên cả hai trang web.

Nhưng đối với những người không có quyền kiểm soát các trang web, điều này sẽ hiệu quả.

+0

Trình tiết kiệm cuộc sống! Cảm ơn bạn rất nhiều :) – NightFury

3

Bạn có thể bỏ qua lỗi ssl bằng cách ghi đè phương thức onReceivedSslError().

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

Hy vọng nó sẽ phù hợp với bạn.

+0

Cảm ơn bạn đã trả lời của bạn. Altho nó có thể làm việc (đã không cố gắng), nó có vẻ như một ý tưởng khủng khiếp để vô hiệu hóa tất cả các lỗi SSL. – Kenneth

+2

Vâng, bạn nói đúng. Điều này là như vậy hoàn toàn đánh bại mục đích của việc có SSL. Tôi không tìm thấy một cách nào tốt hơn ở trên. Kiểm tra nó . (https://code.google.com/p/android/issues/detail?id=2388#c15) –

+0

Lưu ý rằng Google sẽ không cho phép bạn xuất bản ứng dụng của mình với mã này – joao2fast4u

0

Từ nghiên cứu của tôi, tôi không nghĩ rằng có thể tắt tính năng này. Thay vào đó, tôi sẽ hỗ trợ https ở cả hai trang web. Vẫn an toàn nhất.

0

của nó làm việc cho tôi

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.webView.getContext()); 
    AlertDialog alertDialog = builder.create(); 
    String message = "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?"; 
    alertDialog.setTitle("SSL Certificate Error"); 
    alertDialog.setMessage(message); 
    alertDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { 

    public void onClick(DialogInterface dialog, int which) { 
     Log.d("CHECK", "Button ok pressed"); 
     // Ignore SSL certificate errors 
     handler.proceed(); 
    } 
    }); 
    alertDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { 

    public void onClick(DialogInterface dialog, int which) { 
     Log.d("CHECK", "Button cancel pressed"); 
     handler.cancel(); 
    } 
    }); 
    alertDialog.show(); 
Các vấn đề liên quan