Cordova从服务器加载外部内容

时间:2015-12-29 15:45:21

标签: javascript jquery ajax cordova cors

有很多(几乎)类似的问题,但没有一个能解决我的问题。

我正在编写一个cordova应用程序(目前只在andoid和ios上进行测试),并希望从我的网络服务器加载数据(采用JSON格式)。我使用jQuerys $.ajax - 方法。

到目前为止我的代码:

$.support.cors = true;
var ret = -1;
$.ajax(url, {
    traditional: true,
    type: 'POST',
    url: url,
    contentType: 'text/plain',
    xhrFields: {
        withCredentials: false
    },
    data: dataString,
    success: function (data) {
        alert('Data recieved:');
        alert(data);
        ret = data;
    },
    error: function (xhr, ajaxOptions, error) {
        alert('There was an error');
        alert(error);
        alert(xhr.status);
    }
});
return ret;

这适用于浏览器(在最新的Firefox中测试过),但不适用于应用程序。错误似乎是关于跨源页面加载。

我的config.xml如下所示:

...
<plugin name="cordova-plugin-whitelist" spec="1" />
<access origin="*" />
...

服务器通过标头接受cors-requests(否则它可能无法在浏览器中工作):

<?php
header('Access-Control-Allow-Origin: *');
...

但是stil:cordova并不想加载任何东西。 alert(error); - 行显示了这一点:

  

SecurityError:无法执行&#39;打开&#39; on&#39; XMLHttpRequest&#39;:拒绝连接到&#39; https://myHost.com/?someparams=foo&#39;因为它违反了文档的内容安全策略

科尔多瓦有什么问题吗?

2 个答案:

答案 0 :(得分:4)

您可能需要在index.html中设置内容安全策略,以允许对托管您服务的域的请求。

<meta http-equiv="Content-Security-Policy" content="default-src 'self' <enter-your-domain-here> data: gap: https://ssl.gstatic.com;">

cordova-plugin-whitelist 的自述文件有更多示例。

可以找到有关内容安全策略元标记的更多信息here

答案 1 :(得分:2)

基于@toskv的答案。检查Cordova中的HTML-Pages是否包含以下元标记:<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">。默认情况下,Cordova会添加元标记并阻止CORS正常工作(因为您只能看到self允许default-src)。

使用@toskv中的链接了解详情。

  

cordova-plugin-whitelist 的自述文件有更多示例。

     

可以找到有关内容安全策略元标记的更多信息here