Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.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
Jquery 使用Express和ajax进行跨源资源共享_Jquery_Ajax_Node.js_Cross Domain - Fatal编程技术网

Jquery 使用Express和ajax进行跨源资源共享

Jquery 使用Express和ajax进行跨源资源共享,jquery,ajax,node.js,cross-domain,Jquery,Ajax,Node.js,Cross Domain,我的情况如下。我想在express(node.js)上应用跨源资源共享,因此我使用cors。我有一份表格 app.use(cors()); 声明前 app.use(app.router); 在app.js文件上(当然我在文件的顶部加载cors)。对于服务器生成的响应,我使用以下对象: var options = { "ETag" : "", "Access-Control-Allow-Origin" : "*", "A

我的情况如下。我想在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" );
});
现在,我遇到了以下奇怪的情况。当客户机和服务器在同一台机器上运行时,在我写下的url“localhost”中,我可以发布来自客户机(同一台机器)的请求。当我将地址的“localhost”部分替换为服务器在LAN上的实际IP时,我可以从其他机器(以及其他IP)上的客户端发布请求,但不能从服务器实际运行的同一机器上的客户端发布请求。事实上,在这种情况下,当我在同一台机器上使用客户机时,我在服务器日志中看到以下内容:

OPTIONS /aRoute 204 1ms
POST /aRoute 401 2ms
客户告诉我这是未经授权的交易。首先,我发送的用户名和密码肯定是正确的;所以情况并非如此

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

最后,有人能解释一下为什么这个选项会出现在服务器日志中吗?此外,当我在运行服务器的同一台机器上使用客户机时(显然是为了调试目的),以及当我发布来自不同机器的请求时,是否有一种方法可以写下一个跨源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根据我上面列出的选项设置头。

在使用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;
                });

选项是在CORS请求期间发生的请求,使CORS请求能够发生。如果选项请求没有发生,那么CORS也没有发生。好的,但是当我写下服务器的实际IP地址时,我实际上可以发布来自不同机器的请求,而当我在同一台机器上使用客户机时,我却不能这样做,这又有什么理由呢?另外,为什么在两种情况下都不改变代码中的任何内容,我只在其中一种情况(同一台机器上的客户机)中看到此选项部分,而不在另一种情况(不同机器上的客户机)中看到此选项部分?请澄清。不同的机器与相同的机器与CORS无关。这都是关于协议/域/子域/端口的。选项实际上不是CORS的必需部分。选项/预飞行仅针对“非简单”CORS请求发送。对于“简单”CORS请求,不发送选项/飞行前,发送原始请求,但服务器仍必须确认来源,客户端才能访问响应。@KevinB:我使用的是相同的代码,当我在同一台机器上发布来自客户端的请求时,我在服务器上看到选项部分,最终请求被拒绝为“未经授权”(就凭据而言,这毫无意义),而当我在不同的IP上从客户端发布时,我会成功发布请求。
“访问控制允许源站”;“*”
是非常不安全的操作。我们可以使用特定的url模式将用户限制为特定的资源类请求,例如:locahost:3000/用户