22

Android 是否允许原生应用为 http://(不是本地/文件)请求禁用 CORS 安全策略?

在我的本机应用程序中,webview 通过 http:// 显示远程 html,而不是在本地/文件系统上。这似乎是受 CORS 限制的,就像在网络浏览器中一样。

Worakround:一个用于 ajax 跨域请求的 native-js 桥接器Access-Control-Allow-Origin: *是我的 quick'n'dirt 解决方案。(jsonp 或服务器端代理不是一个选项,因为 web 服务会检查客户端的 cookie+ip。)

可以为应用内网页视图禁用此策略吗?

请让我知道,如果有一个简单的标志允许 js 绕过这个限制“本机”应用程序的 webview 的限制。

4

3 回答 3

14

这现在可以从 Android API 级别 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 响应需要检查来自 WebResourceRequest 的请求的 HTTP 方法,该方法仅在 API 21 之后可用。

于 2015-12-02T02:50:05.317 回答
11

AFAIK 这是不可能的,相信我,我已经尝试了很多方法。

你能做的最好的就是覆盖资源加载。请参阅拦截和覆盖来自 WebView 的 HTTP 请求

于 2013-06-24T10:03:20.437 回答
2

帮助我在 Xamarin 中使用 c# 的较短版本如下:

    public override WebResourceResponse ShouldInterceptRequest(WebView view, IWebResourceRequest request)
    {
        if (request.Url.SchemeSpecificPart.StartsWith("//<domain>/"))
        {
            request.RequestHeaders.Add("Access-Control-Allow-Origin", "*");
        }

        return base.ShouldInterceptRequest(view, request);
    }

此覆盖是为 完成的Android.Webkit.WebViewClient,其中<domain>是 CORS 策略阻止的那个。

于 2021-08-27T06:43:21.057 回答