2015-02-20 6 views
8

Ho una soluzione in cui il mio Android WebView deve prima aprire un URL https, quindi verrà reindirizzato a un url http (potrebbe provare un POST http dal sito https). Questo non funziona e il mio log di debug di Android dice:Android WebView blocca il reindirizzamento da https a http

02-20 11: 04: 45.079 8538-8538 /? E/WebViewCallback: URL bloccato: [bloccato] La pagina "https://xxx/" è stata caricata su HTTPS, ma sta inviando dati a una posizione non protetta a "http://yyy": questo contenuto deve essere inoltrato anche su HTTPS.

Esistono opzioni di configurazione in WebView che consentiranno questo comportamento?

Altre informazioni: sembra un cambiamento di comportamento nell'SDK di Android. Un cliente compilato molto tempo fa lo fa senza lamentele.

risposta

25

C'è stato un cambiamento nelle impostazioni di WebView predefinite per il contenuto misto http/https in Lollipop (API 20). Vedi https://datatheorem.github.io/android/2014/12/20/webviews-andorid-lollipop/ per maggiori dettagli.

Per consentire https per reindirizzare a http è necessario impostare la modalità di contenuto misto di MIXED_CONTENT_ALWAYS_ALLOW

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

Nota che l'impostazione MIXED_CONTENT_ALWAYS_ALLOW è un male dal punto di vista della sicurezza, e, come si nota nella sua risposta, è meglio supportare https su entrambi i siti.

Ma per coloro che non hanno il controllo sui siti, questo dovrebbe funzionare.

+0

Life saver! Grazie mille :) – NightFury

3

È possibile ignorare l'errore ssl ignorando il metodo onReceivedSslError().

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

Spero che sarà lavoro per voi.

+0

Grazie per la risposta. Anche se potrebbe funzionare (non ho provato), sembra un'idea orribile per disabilitare tutti gli errori SSL. – Kenneth

+2

Sì, hai ragione. Questo è così completamente sconfigge lo scopo di avere SSL. Non trovo un altro modo migliore di quello sopra. Controllalo . (https://code.google.com/p/android/issues/detail?id=2388#c15) –

+0

Tieni presente che Google non ti consentirà di pubblicare la tua app con questo codice – joao2fast4u

0

Dalla mia ricerca non penso sia possibile disabilitare questa funzione. Supporterò invece https in entrambi i siti. Comunque più sicuro

0

sua ha lavorato per me

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