【问题标题】:cross domain event source跨域事件源
【发布时间】:2011-09-12 23:49:52
【问题描述】:

我正在尝试使用 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'
});

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

问候

【问题讨论】:

  • Opera 不支持CORS
  • 可能,但 Chrome 确实支持 CORS,但我仍然遇到安全异常(SECURITY_ERR: DOM Exception 18)。我相信一定有一个 hack,比如 XHR 的 Acces-Control-Allow-Origin,但我就是找不到。
  • 虽然w3.org/TR/cors 有一个部分展示了它如何与 SSE 一起使用,但似乎浏览器暂时忽略了它,目前不支持 CORS+SSE。
  • 希望得到确认 ^,我在 EventSource XHR 上设置标题时遇到困难。

标签: node.js cross-domain cors


【解决方案1】:

在允许来源设置为 * 的情况下,不能使用允许凭据。 考虑在您的回复中写入收到的 Origin-header

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      试试下面的块来代替你的块。浏览器会调用一次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();
      }
      

      【讨论】:

        【解决方案4】:

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

        1. 试图通过file://(不通过节点服务器提供本地文件)或
        2. 访问本地资源
        3. 试图从另一个不允许 CORS 的服务器访问资源或
        4. 也许您正在从本地文件而不是从您的节点服务器提供的 URL 测试页面。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-23
          • 2021-07-25
          • 2018-05-04
          • 1970-01-01
          • 2011-05-07
          • 1970-01-01
          • 1970-01-01
          • 2013-01-12
          相关资源
          最近更新 更多