0

我正在开发一个 chrome 应用程序,终于到了向 node.js 服务器发出 PUT 的地步。我的 GET 逻辑工作正常。然而,我的 PUT 被劫持到一个 OPTIONS 请求中。我的要求是

http://localhost:4000/whatever

我读到了 OPTIONS 通行证,要求允许执行 PUT。我的印象是 BROWSERS 在请求 CORS 时会发出 OPTIONS,但没有意识到 chrome 应用程序也会为我执行此操作。

应用程序这样做是因为我没有而且我应该这样做,还是这个 SOP chrome 会发出 OPTIONS 请求而我只是发出触发它的 PUT?

我的 PUT 永远不会到达服务器。我尝试在 PUT 之前发布自己的 OPTIONS,但到目前为止没有任何效果。OPTIONS 请求将其发送到服务器(默认的或我的),但这就是对话的结束。

在服务器上,我为满足 OPTIONS 请求所做的一切如下:

case 'OPTIONS':
   res.writeHead(200, {'Access-Control-Allow-Methods': 'OPTIONS, TRACE, GET, HEAD, POST, PUT',
                       'Access-Control-Allow-Origin': "*"});
   break;

当我尝试发出自己的 OPTIONS & PUT 请求时,我使用单独的 XMLHttpRequest 对象来执行它们。我看不到从 OPTIONS 到 PUT 的权限移交是在哪里进行的。

4

1 回答 1

2

这称为“预检”,如果跨域请求符合特定标准,浏览器必须预检它们。例如,如果请求方法不是 GET 或 POST,浏览器必须预检请求。您需要在服务器中正确处理这些 OPTIONS(预检)请求。

据推测,您的页面托管在 4000 以外的端口上,然后对端口 4000 的调用被视为跨域(在 IE 以外的所有浏览器中)。不要自己发出 OPTIONS 请求。然后,Chrome 会预检您的请求。您的服务器必须做出适当的响应。浏览器将为您处理对此 OPTIONS 请求的响应,然后如果您的服务器正确处理了 OPTIONS 请求,则按预期发送 PUT。

Mozilla Developer Network 上有一篇很棒的文章,涵盖了 CORS 的所有内容。如果你打算在任何跨域环境中工作,你应该阅读这篇文章。它将为您提供了解正确处理此类环境所需的概念所需的大部分知识。

于 2013-08-17T19:36:42.763 回答