【问题标题】:Cross origin resource sharing using Express and ajax使用 Express 和 ajax 进行跨域资源共享
【发布时间】:2013-11-24 20:36:25
【问题描述】:

我处于以下情况。我想在 express (node.js) 上应用跨源资源共享,因此我使用 cors。我有一份表格的声明

app.use(cors());

语句之前

app.use(app.router);

在 app.js 文件上(当然我在文件的顶部加载 cors)。对于服务器生成的响应,我使用以下对象:

var options = {
    "ETag"                         : "",
    "Access-Control-Allow-Origin"  : "*",
    "Access-Control-Allow-Methods" : "HEAD,GET,PUT,POST,DELETE,OPTIONS",
    "Content-Type"                 : "application/json; charset=utf-8",
    "Transfer-Encoding"            : "chunked"
};

然后通过遍历这个对象的键,我设置了每个响应的标题。

我相信到目前为止一切顺利。现在,在客户端,我使用 ajax 来发布这样的请求:

$.ajax({
    type: "POST",
    accepts: "application/json",
    url: urlForPOST,
    data: JSON.stringify(theData),
    async: true,
    contentType: "application/json; charset=UTF-8", 
    dataType: "json",
    success: function(data, textStatus, jqXHR) {
        alert("Received success: '" + JSON.stringify(data) + "' with ETag '" + jqXHR.getResponseHeader('ETag') + "'");
    },
    error: function (data, textStatus, errorThrown) {
        alert("Received error: '" + JSON.stringify(data) + "'\n Status: '" + textStatus + "'\n error thrown = '" + errorThrown + "'");
    },
    crossDomain: true,
    username: myData.username,
    password: myData.password
}).done(function() {
    alert( "second success" );
}).fail(function() {
    alert( "error while posting" );
}).always(function() {
    alert( "finished" );
});

现在,我遇到了以下奇怪的情况。当客户端和服务器在同一台机器上运行并且在我写下“localhost”的 url 中时,我可以发布来自客户端(同一台机器)的请求。当我将地址的“localhost”部分替换为服务器在 LAN 上的实际 IP 时,我可以发布来自其他机器(以及其他 IP)中客户端的请求,但 不是来自客户端在服务器实际运行的同一台机器上。事实上,在这种情况下,当我在同一台机器上使用客户端时,我会在服务器日志中看到以下内容:

OPTIONS /aRoute 204 1ms
POST /aRoute 401 2ms

客户告诉我这是未经授权的交易。好吧,首先我发送的用户名和密码肯定是正确的;所以事实并非如此。

此外,在这种情况下,为什么这个 OPTIONS 会出现在日志中?当我从在其他机器上运行的客户端发布时,服务器日志中没有这样的东西。此外,这不是我所期望的。

最后,有人可以解释为什么这个 OPTIONS 在这种情况下出现在服务器日志上吗?此外,有没有一种写下跨源ajax请求的方法,当我在服务器运行的同一台机器上使用客户端时(显然是出于调试目的),以及当我从不同机器发布请求时都可以使用?这里至少有一个细节我遗漏了。

提前感谢您的时间和帮助。


我正在编辑原始帖子以提及这件事: 当我删除对“cors”模块和相关“app.use(cors());”的要求时声明,然后我可以使用“app.options(...);”拦截地址上的传入请求并打印一个 console.log 语句。特别是我使用的语句:

app.options(aRoute, function (request, response, next) {
    console.log("FOLLOWING ROUTE THROUGH OPTIONS");
    defs.SET_DEFAULT_JSON_HEADER(response);
    next();
});

其中 SET_DEFAULT_JSON_HEADER 根据我上面列出的选项设置标题。

【问题讨论】:

  • OPTIONS 是在 CORS 请求期间发生的请求,它使 CORS 请求可能发生。如果 OPTIONS 请求没有发生,那么 CORS 就没有发生。 en.wikipedia.org/wiki/Cross-origin_resource_sharing
  • 好的,但是当我写下服务器的实际 IP 地址时,我怎么能证明我实际上可以从另一台机器发出请求,而当我无法这样做时在同一台机器上使用客户端?另外,为什么在两种情况下都没有更改代码中的任何内容,我是否只在其中一种情况下(同一台机器上的客户端)看到此 OPTIONS 部分,而在另一种情况下(另一台机器上的客户端)中看不到?
  • 请澄清。不同机器与相同机器与 CORS 无关。都是关于协议/域/子域/端口的。
  • OPTIONS 实际上不是 CORS 的必需部分。仅针对“非简单”CORS 请求发送 OPTIONS/preflight。对于“简单”的 CORS 请求,不发送 OPTIONS/preflight,而是发送原始请求,但服务器仍必须确认 Origin 以便客户端能够访问响应。
  • @KevinB:我使用相同的代码,当我在同一台机器上发布来自客户端的请求时,我看到服务器上的 OPTIONS 部分,最终请求被拒绝为“未经授权”(就凭据而言,这毫无意义),而当我从不同 IP 上的客户端发布时,我成功发布了请求。

标签: jquery ajax node.js cross-domain


【解决方案1】:

我在 chrome 中使用 ajax 调用跨源资源时遇到问题。

我已经使用 node js 和本地 http 服务器来部署我的 node js 应用程序。

当我访问跨源资源时收到错误响应

我找到了一个解决方案,

    1) I have added below code to my app.js file

        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Headers", "X-Requested-With");

    2) In my html page called cross origin resource using $.getJSON();

         $.getJSON("http://localhost:3000/users", function (data) {
                alert("*******Success*********");
                   var response=JSON.stringify(data);
                    alert("success="+response);
                    document.getElementById("employeeDetails").value=response;
                });

【讨论】:

  • "Access-Control-Allow-Origin", "*" 是相当不安全的操作。
  • 我们可以将用户限制为特定资源,例如具有特定 url 模式的请求,例如:locahost:3000/users
猜你喜欢
  • 2017-10-06
  • 2011-03-25
  • 2014-04-23
  • 2011-12-25
  • 2012-07-12
  • 2011-07-05
  • 2011-05-07
  • 2011-03-27
相关资源
最近更新 更多