2015-02-20 12 views
8

पर रीडायरेक्ट करते हैं मेरे पास एक समाधान है जहां मेरे एंड्रॉइड वेबव्यू को पहले https url खोलने की आवश्यकता होती है, फिर इसे http url पर रीडायरेक्ट किया जाएगा (यह https साइट से http POST को आजमा रहा है)। यह काम नहीं कर रहा है, और मेरा एंड्रॉइड डीबग लॉग कहता है:एंड्रॉइड वेबव्यू ब्लॉक https से http

02-20 11: 04: 45.079 8538-8538 /? ई/वेब व्यू कॉलबैक: अवरुद्ध यूआरएल: [अवरुद्ध] 'https://xxx/' पर पृष्ठ HTTPS पर लोड किया गया था, लेकिन 'http://yyy' पर एक असुरक्षित स्थान पर डेटा सबमिट कर रहा है: यह सामग्री HTTPS पर भी सबमिट की जानी चाहिए।

क्या वेब व्यू में कोई कॉन्फ़िगरेशन विकल्प हैं जो इस व्यवहार की अनुमति देंगे?

अधिक जानकारी: यह एंड्रॉइड एसडीके में एक व्यवहार परिवर्तन की तरह लगता है। एक लंबे समय पहले संकलित एक ग्राहक बिना किसी शिकायत के करता है।

उत्तर

25

लॉलीपॉप (एपीआई 20) में मिश्रित http/https सामग्री के लिए डिफ़ॉल्ट वेबव्यू सेटिंग्स में बदलाव आया था। अधिक जानकारी के लिए https://datatheorem.github.io/android/2014/12/20/webviews-andorid-lollipop/ देखें।

https में http आप MIXED_CONTENT_ALWAYS_ALLOW को

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

ध्यान दें कि MIXED_CONTENT_ALWAYS_ALLOW निर्धारित करके, दृश्य की सुरक्षा की दृष्टि से खराब है मिश्रित सामग्री मोड सेट करने की जरूरत है रीडायरेक्ट करने के लिए अनुमति देने के लिए, और के रूप में आप अपने जवाब में ध्यान दें, यह है दोनों साइटों पर https का समर्थन करने के लिए बेहतर है।

लेकिन उन लोगों के लिए जो साइट पर नियंत्रण नहीं रखते हैं, यह काम करना चाहिए।

+0

लाइफ सेवर! बहुत बहुत धन्यवाद :) – NightFury

3

आप receivedSslError() विधि को ओवरराइड करके एसएसएल त्रुटि को अनदेखा कर सकते हैं।

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

आशा है कि यह आपके लिए काम करेगा।

+0

अपने जवाब के लिए धन्यवाद काम किया। यह भी काम कर सकता है (कोशिश नहीं की है), यह सभी एसएसएल त्रुटियों को अक्षम करने के लिए एक भयानक विचार की तरह लगता है। – Kenneth

+2

हाँ, आप सही हैं। यह एसएसएल रखने के उद्देश्य को पूरी तरह से हरा देता है। मुझे उपरोक्त से बेहतर तरीका नहीं मिला है। इसे जाँचे । (https://code.google.com/p/android/issues/detail?id=2388#c15) –

+0

ध्यान दें कि Google आपको इस कोड के साथ अपना ऐप प्रकाशित करने की अनुमति नहीं देगा – joao2fast4u

0

मेरे शोध से मुझे नहीं लगता कि यह सुविधा अक्षम करना संभव है। मैं बजाय दोनों साइटों में https का समर्थन करूंगा। वैसे भी सुरक्षित

0

इसके लिए मुझे

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(); 
संबंधित मुद्दे