跨域事件源

时间:2011-06-11 09:09:44

标签: node.js cross-domain cors

我正在尝试使用nodejs创建一个EventSource服务器,这将服务器跨域请求。我发送回Access-Control-Allow-Origin标题,但浏览器(也不是Chrome或Opera)不允许我连接。有我发回的标题:

this._response.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Credentials': 'true'
});

我怎样才能以正确的方式做到这一点?

此致

4 个答案:

答案 0 :(得分:4)

参见https://github.com/Yaffle/EventSource - 可以采用polyfill来支持Firefox,Webkit和IE 8 +的CORS

答案 1 :(得分:3)

允许凭据不能与allow origin设置为*一起使用。 考虑在回复中编写收到的Origin-header

答案 2 :(得分:2)

尝试使用以下块代替您的。浏览器将使用OPTIONS调用一次,然后在此之后按预期进行请求。

如果你已经破坏了请求方法,你将不需要if语句 - 但我想给你一个完整的块,以防你像 Hello World那样托管它例子确实。

if (req.method === "OPTIONS") {
    console.log('!OPTIONS');
    var headers = {};
    // IE8 does not allow domains to be specified, just the *
    // headers["Access-Control-Allow-Origin"] = req.headers.origin;
    headers["Access-Control-Allow-Origin"] = "*";
    headers["Access-Control-Allow-Methods"] = "POST, GET, PUT, DELETE, OPTIONS";
    headers["Access-Control-Allow-Credentials"] = false;
    headers["Access-Control-Max-Age"] = '86400'; // 24 hours
    headers["Access-Control-Allow-Headers"] = "X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept";
    res.writeHead(200, headers);
    res.end();
}

答案 3 :(得分:1)

如果您使用跨域资源,则会获得Security Exception (SECURITY_ERR: DOM Exception 18)。这可能是由于:

  1. 尝试通过file://(本地文件未通过节点服务器提供)或
  2. 访问本地资源
  3. 尝试从不允许使用CORS或
  4. 的其他服务器访问资源
  5. 也许您正在测试本地文件中的页面,而不是来自节点服务器提供的URL。