Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cors 即使将服务器域URL添加到权限中,Chrome应用程序中的非GET请求中也会存在原始标头_Cors_Google Chrome App - Fatal编程技术网

Cors 即使将服务器域URL添加到权限中,Chrome应用程序中的非GET请求中也会存在原始标头

Cors 即使将服务器域URL添加到权限中,Chrome应用程序中的非GET请求中也会存在原始标头,cors,google-chrome-app,Cors,Google Chrome App,我正在开发一个chrome应用程序,它将通过RESTfulAPI与服务器通信 如果不将服务器URL添加到manifest.json中的权限中,我可以看到Chrome发送所有带有原始标头(Chrome)的请求-extension://cpndc....)如果这些请求中有任何一个具有非标准头,它也会发送一个飞行前选项请求——这一切都是意料之中的 将域添加到权限后,将不再发送飞行前选项。GET调用中不存在原始标头,但它仍然存在于POST、PATCH、MERGE调用中 这会导致问题,因为我将使用的服务器

我正在开发一个chrome应用程序,它将通过RESTfulAPI与服务器通信

如果不将服务器URL添加到manifest.json中的权限中,我可以看到Chrome发送所有带有原始标头(Chrome)的请求-extension://cpndc....)如果这些请求中有任何一个具有非标准头,它也会发送一个飞行前选项请求——这一切都是意料之中的

将域添加到权限后,将不再发送飞行前选项。GET调用中不存在原始标头,但它仍然存在于POST、PATCH、MERGE调用中

这会导致问题,因为我将使用的服务器上的CORS实现假定具有源文件头的请求是CORS请求,并以403错误响应,因为它不喜欢源文件-此具有chrome扩展名的源文件不在可接受的源文件列表中

根据CORS规范,我们的期望是,应该只在跨域请求中添加源标头,但由于服务器域被添加到权限中,所以我期望不仅GET而且其他请求都没有它

问题是:这是Chrome应用CORS实现中的一个bug吗

我在使用Chrome应用程序时的发现摘要:

如果未将端点URL添加到清单文件中的权限(CORS将启动): -Chrome应用程序在所有类型的请求中发送原始标头 -Chrome应用程序为所有具有非标准标题的请求发送选项飞行前

如果将端点URL添加到清单文件中的权限(对该域的请求的安全性已关闭) -Chrome应用程序不再发送飞行前选项(如预期) -Chrome应用程序仅在非GET请求中发送源文件头(根本不应发送源文件)

权限文件示例:

  "permissions": [
"http://api.randomuser.me/*"
]

示例应用程序代码:

window.onload = function() {

function get(){
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://api.randomuser.me/?seed=bigFish", true);
    xhr.setRequestHeader('Authn', 'abcdefghijklmnopqrstuvxyz');
    xhr.onload = function (e) {
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          console.log(xhr.responseText);
        } else {
          console.error(xhr.statusText);
        }
        post();
      }
    };
    xhr.onerror = function (e) {
      console.error(xhr.statusText);
    };
    xhr.send(null);   
}

function post() {
    var xhr = new XMLHttpRequest();
    xhr.open('POST', 'http://api.randomuser.me/', true);
    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
    xhr.setRequestHeader('Authn', 'abcdefghijklmnopqrstuvxyz');
    xhr.onload = function () {
        // do something to response
        console.log(this.responseText);
    };
    xhr.send('user=person&pwd=password&organization=place&requiredkey=key');
}

document.getElementById('mybutton').addEventListener('click', function() {
    get();
});
})

获取不带原始标头的请求:

使用原始标题发布请求:

我刚刚在StackOverflow上发现了一个类似的问题:

其中一个答案指向规范:rfc6454#第7.3节:

根据它,用户代理可以在任何HTTP请求中包括源报头字段

这意味着原始标题不必与CORS相关