Montag, Mai 25, 2020

Android Webview: deaktivieren CORS

Macht Android sind native apps zu deaktivieren CORS security-Richtlinien für http://(nicht-lokale/Datei) Anfragen?

In meine native app eine webview zeigt eine remote-html über http://, nicht auf die lokale/Datei-system. Dies scheint zu sein, CORS-eingeschränkt auf die gleiche Weise wie in Web-Browsern.

Worakround: Eine native js-Brücke für ajax-Anfragen, die auf cross-domains, die nicht über Access-Control-Allow-Origin: * ist meine quick ‚ N ‚ ‚dirt Lösung. (jsonp oder server-side proxy ist keine option, da cookie+ip der client überprüft die vom webservice.)

Kann diese Richtlinie deaktiviert werden inapp webviews?

Bitte lassen Sie mich wissen, wenn es eine einfache fahne für das zulassen von js, um diese Einschränkung umgehen, die Grenzen der „native“ app-webview.

InformationsquelleAutor ledy | 2013-06-24

2 Kommentare

  1. 7

    AFAIK ist das nicht möglich, und glauben Sie mir, ich habe viele Wege versucht.

    Das beste, was Sie tun können, ist zu überschreiben, laden von Ressourcen. Sehen Abfangen und überschreiben die HTTP-Anfragen von WebView

    • Obwohl negative, vielen Dank für Eure Erfahrung und Antwort.
    • Sorry für das Fragen wieder. Das kann nicht sein „befestigt“ durch shouldInterceptRequest seit api 11 durch Manipulation der header-Antwort CORS-angenommen immer?
    • Es wird möglich, siehe meine Antwort unten.
    • Jede Idee, wie dies zu überwinden frm REAGIEREN-NATIVE, wenn ich mich über einen POST-request? Bitte siehe stackoverflow.com/questions/52178543/…
  2. 10

    Ist dies nun möglich, da der Android-API-level 21. Sie können eine OPTIONEN Antwort etwa so:

    public class OptionsAllowResponse {
        static final SimpleDateFormat formatter = new SimpleDateFormat("E, dd MMM yyyy kk:mm:ss", Locale.US);
    
        @TargetApi(21)
        static WebResourceResponse build() {
            Date date = new Date();
            final String dateString = formatter.format(date);
    
            Map<String, String> headers = new HashMap<String, String>() {{
                put("Connection", "close");
                put("Content-Type", "text/plain");
                put("Date", dateString + " GMT");
                put("Access-Control-Allow-Origin", /* your domain here */);
                put("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT, OPTIONS");
                put("Access-Control-Max-Age", "600");
                put("Access-Control-Allow-Credentials", "true");
                put("Access-Control-Allow-Headers", "accept, authorization, Content-Type");
                put("Via", "1.1 vegur");
            }};
    
            return new WebResourceResponse("text/plain", "UTF-8", 200, "OK", headers, null);
        }
    }

    und dann nennen Sie es von Ihrem WebViewClient Implementierung wie folgt:

        @Override
        @TargetApi(21)
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            if (request.getMethod().equalsIgnoreCase("OPTIONS")) {
                return OptionsAllowResponse.build();
            }
    
            return null;
        }

    Dieser funktioniert erst ab API-level 21, da die OPTIONEN Reaktion erfordert die Einsichtnahme in die angeforderten HTTP-Methode aus der WebResourceRequest, die nur erhältlich ist, da API-21.

    • Ich sehe nicht, wie dies deaktiviert CORS, nur es fängt die Anforderung ab und zurückgeben, was Sie wollen, aber nicht die tatsächliche Anforderung Daten.
    • Sie sind richtig, dass es nicht direkt auf die Anfrage verarbeiten von Daten für die GET/PUT/POST-Anforderung, aber CORS umfasst beiden – Anforderungen: die erste ist eine HTTP-OPTIONS-Anfrage keine Anfrage Daten, die prüft, ob die GET/PUT/POST durchgehen können, und wenn ja, ist die WebView wird fortgesetzt, um die tatsächliche Anforderung mit den Daten. Dieser code überschreibt die Beantwortung für die ersten OPTIONEN, die Anfrage, so dass der zweite Antrag durchgehen wird.
    • wie bringen Sie die Anforderungen von javascript? In meinen tests nie hab ich die OPTIONS-Anfrage, nur der eigentliche Antrag, die scheiterten, so dass ich schließlich mit einem HttpURLConnection um die Daten der Datei und schicken Sie es in die WebResourceResponse
    • In Javascript ist es einfach nur Anfragen stellen, als normal zB. durch XMLHttpRequest-oder fetch-oder was auch immer. Das Java ist hier umgesetzt in der WebViewClient Klasse, die zugewiesen wird, um die WebView in denen Javascript ausgeführt wird. Ich bin mir nicht sicher, was dein setup ist, oder dass Sie erleben CORS-Probleme, aber Sie sollten Lesen Sie developer.mozilla.org/en-US/docs/Web/HTTP/CORS um zu verstehen, die CORS-Protokoll.
    • Jede Idee, wie dies zu überwinden frm REAGIEREN-NATIVE, wenn ich mich über einen POST-request? Bitte siehe stackoverflow.com/questions/52178543/…
    • Sorry, wieder zu beleben ein altes Thema, habe ich gerade ausprobiert, allerdings fetch-Anfragen in JS noch die Rückkehr versagt CORS. Ich habe Haltepunkte gesetzt und gewährleistet build() genannt wird, und die Rückkehr ist richtig.
    • Ich denke, dass Sie möglicherweise senden Sie die OPTIONS-Anfrage an die falsche domain haben, finden Sie zum Beispiel wuchs in CORS wiki .

Kostenlose Online-Tests