CORS + Cordova:问题:Access-Control-Allow-Origin

Posted

技术标签:

【中文标题】CORS + Cordova:问题:Access-Control-Allow-Origin【英文标题】:CORS + Cordova : issues with : Access-Control-Allow-Origin 【发布时间】:2016-09-20 18:55:52 【问题描述】:

我已经在这个问题上搜索了几个小时,但我仍然找不到任何解决方案。

我正在开发一个 App cordova(基本上是 html / JS) 所以:应用程序从导航器在移动设备上运行,我无法向 API 发出 ajax 请求:https://developer.riotgames.com/ 但是假设我只想获取 google 页面。

我到底该怎么做,这甚至可能吗? 这是一个简单的例子:

$.ajax(
    type: "GET",
    url: "https://google.com",
    dataType: "text",
    success: function(response)
        alert("!!!");
    ,
    error: function(error)
        alert("...");
    
);

我一次又一次地遇到同样的错误:

XMLHttpRequest 无法加载 https://google.com/。不 请求中存在“Access-Control-Allow-Origin”标头 资源。因此,Origin 'null' 不允许访问

起源 'null' 是因为我从 file:///D:/Projets/LoL/www/index.html 运行代码并且我读到导航器正在阻塞,但是如果我使用 --disable-web-security 禁用安全性,它就不能正常工作 当然,我无权访问我想加入的服务器。

【问题讨论】:

XmlHttpRequest error: Origin null is not allowed by Access-Control-Allow-Origin 的可能重复项。我建议对 JSONP 进行一些阅读,但一般来说,如果您无法修改服务器,那么就没有好方法来做您想做的事情。 【参考方案1】:

您需要 Cordova 白名单插件:https://cordova.apache.org/docs/en/latest/reference/cordova-plugin-whitelist/。

在 config.xml 中有这个:

<access origin="*" />
<allow-navigation href="*"/>

并且在 index.html 中有 Content-Security-Policy 元数据。比如:

<meta http-equiv="Content-Security-Policy" content="default-src *; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data:">

【讨论】:

当我作为浏览器运行时,它对我不起作用。我仍然有:“跨域请求被阻止:同源策略不允许读取localhost:7788/testAction 的远程资源。这可以通过将资源移动到同一个域或启用 CORS 来解决。 如果您部署到手机上,您可能会得到更好的结果。我读到(不幸的是我不记得在哪里)从应用程序或浏览器运行时,CORS 响应略有不同。我创建了一个在我的元标记中启用了 CORS 的测试应用程序,它仅在我将其部署到我的手机时才有效 - 而不是从我的桌面。 向我抛出 500 条拒绝内容安全策略指令的错误 我不得不用这个网站上的信息来补充这个提示:content-security-policy.com... 现在一切正常。 将 添加到 config.xml 为我修复了它。将元标记添加到 index.html 给我带来了一些奇怪的错误【参考方案2】:

如果 Cordova Whitelist 插件不适合您,您可以使用 Cordova 高级 Http 插件调用外部服务器。

安装使用: cordova 插件添加 cordova-plugin-advanced-http

插件链接: https://github.com/silkimen/cordova-plugin-advanced-http?ref=hackernoon.com

额外信息: https://hackernoon.com/a-practical-solution-for-cors-cross-origin-resource-sharing-issues-in-ionic-3-and-cordova-2112fc282664

【讨论】:

【参考方案3】:

如果您刚从 2019 年 8 月 1 日开始遇到此问题。此Access-Control-Allow-Origin Error..(using cordova) 可能与该问题有关。

【讨论】:

【参考方案4】:

我在 nodejs 服务器中添加了以下内容,解决了我的问题;

app.use(function(req, res, next) 
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
);

如果您使用的是 nodejs,这可能会有所帮助。

谢谢

【讨论】:

【参考方案5】:

我找到了类似情况的解决方案,但出现错误: "access-control-allow-origin 不能包含多个来源"

最终我发现,虽然我已将 .net 核心 API 设置为允许所有来源,如下所示:

public void ConfigureServices(IServiceCollection services)
        
            services.AddCors();
...

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            app.UseCors(builder => builder
            .AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader());
            app.UseEndpoints(endpoints =>
            
                endpoints.MapControllers();
            );
...

然后,我在 API 网站根目录的 web.config 文件中留下了一个旧的 CORS 命令:

     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="https://localhost:444" />
     </customHeaders>

我注释掉了 customHeaders 部分,它起作用了。

任务完成!

【讨论】:

【参考方案6】:

没有必要这样做

你只是尝试更改权限

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
<uses-permission android:name="android.permission.INTERNET" />
<application
    ...
    android:usesCleartextTraffic="true"
    ...>
    ...
</application>

【讨论】:

以上是关于CORS + Cordova:问题:Access-Control-Allow-Origin的主要内容,如果未能解决你的问题,请参考以下文章

PhoneGap/Cordova、波纹仿真器、CORS 和 JSONP

Cordova 应用程序的 API 服务器 CORS 白名单

启用 CORS 从 Cordova 应用程序调用 JSON REST

CORS 政策问题刚刚开始,没有代码更改 - “CORS 政策:'Access-Control-Allow-Origin' 标头包含多个值”

没有'Access-Control-Allow-Origin' cors问题[重复]

多个 CORS 标头“Access-Control-Allow-Origin”不允许/CORS 标头“Access-Control-Allow-Origin”缺失)