当前位置: 首页 > 知识库问答 >
问题:

Android Webview:禁用CORS

宣望
2023-03-14

Android是否允许本机应用程序禁用超文本传输协议的CORS安全策略://(不是本地/文件)请求?

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

Worakround:一个本机js桥,用于将ajax请求发送到没有Access-Control-Allow-Origin:*跨域。(jsonp或服务器端代理不是一个选项,因为Web服务会检查客户端的cookie ip。)

是否可以为应用内 Web 视图禁用此策略?

如果有一个简单的标志允许js绕过这个限制,限制“原生”应用程序的webview,请告诉我。

共有3个答案

段干庆
2023-03-14

以下是帮助我在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,其中

曹伟泽
2023-03-14

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

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

姜胤
2023-03-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);
    }
}

,然后从您的 Web 视图客户端实现中调用它,如下所示:

    @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之后可用。

 类似资料:
  • 移动应用程序新手。我正在尝试在我的android应用程序上使用webview。但我的代码中有一个问题。我使用了https://developer.android.com/但它现在不知怎么起作用了。你能查一下我的密码吗。。。。 Android说“无法解决符号webview”... 整个代码都在这里-

  • java版本“1.8.0_25”java(TM)SE运行时环境(版本1.8-0_2-b18)java热点(TM)64位服务器虚拟机(版本25.25-b02,混合模式) Appia1.3.4.1 Android SDK ro . build . version . SDK = 21.. 使用的设备:-Nexus 7,5.0.2 你好 我使用下面的代码从android.webkit.webview获取

  • 问题内容: 也许我完全丢失了一些东西,但是我有一个本地运行的服务器,并且 没有 将Angular配置为对$ http请求使用CORS。当我向localhost:发出HTTP请求时,我看到Chrome首先创建了OPTIONS请求。 因为我需要支持IE 8,并且AngularJS绝对不能在CORS中使用,所以我需要删除CORS。 我尝试直接设置 不 使用包装器的方法,但没有任何效果。也许这与https

  • 这是一个禁用的测试案例: import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @Disabled class DisabledClassDemo { @Test void testWillBeSkipped() { } } 这是一个带有禁用测试方法的测试案例: import

  • 问题内容: 单击后,我想在iOS上禁用按钮()。我是开发iOS的新手,但我认为目标上的等效代码-C是这样的: 但是我不能迅速做到这一点。 问题答案: Swift中的布尔值是。 应该做。 这是的属性的Swift文档。

  • Apache 2.4.37安装在Centos7上,没有安装lets加密应用程序,httpd.conf文件中没有虚拟主机。 下面是ssl设置的一部分。conf文件。 也尝试了下面的条目,但不起作用。SSLProtocol TLSv1。2. nmap仅显示tls1。2已启用,但ssllab和https://www.cdn77.com/tls-test两者都显示tls 1.0和1.1已启用。 有人能帮我