Android Webview: отключить CORS

позволяет ли Android собственным приложениям отключать политики безопасности CORS для запросов http:// (не локальных/файловых)?

в моем родном приложении webview показывает удаленный html через http://, а не в локальной / файловой системе. Это, по-видимому, ограничено CORS таким же образом, как и в webbrowsers.

Worakround: собственный мост-js для ajax-запросов к кросс-доменам, у которых нет Access-Control-Allow-Origin: * Это мое решение quick'n'Dirt. (JSONP или серверный прокси-сервер не является вариантом, потому что cookie+ip клиента проверяет webservice.)

можно ли отключить эту политику для iNAPP webviews?

пожалуйста, дайте мне знать, если есть простой флаг для разрешения js обойти это ограничение, которое ограничивает webview "родного" приложения.

2 ответов


AFAIK это невозможно, и поверьте, я пробовал много способов.

лучшее, что вы можете сделать, это переопределить загрузки ресурсов. См.перехватывать и переопределять HTTP-запросы от WebView


теперь это возможно с уровня API Android 21. Вы можете создать ответ OPTIONS следующим образом:

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

а затем вызовите его из своей реализации WebViewClient следующим образом:

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

        return null;
    }

это работает только с уровня API 21, так как ответ OPTIONS требует проверки запрошенного HTTP-метода из WebResourceRequest, который доступен только с API 21.