节点js使用CORS和JSON

时间:2015-12-30 14:21:28

标签: javascript json node.js cors body-parser

我发布了关于标题所暗示的问题的主题。我见过其他几个关于空请求机构的问题,但没有一个对我有帮助。希望如果我发布自己的代码,有人可以给我一个很好的提示。

基本上我有一个客户端使用javascript向Node.js服务器发出CORS HTTPRequests。通常这些HTTPRequests是JSON对象的帖子。

这是客户端的示例代码。

username = document.getElementById("username").value;
password = document.getElementById("password").value;
var str = '{"name":"'+username+'","pass":"'+password+'"}';
var req = new XMLHttpRequest();
req.open("POST","http://xxxx:8099/register",true)
req.setRequestHeader("Content-type", "application/json");
req.onreadystatechange = function() 
{
     //irrelevant
}
req.send(str);

}

这是服务器的代码。

var express    = require('express');
var bodyParser = require('body-parser');
var app = express();
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({
extended: true
}));

// parse application/json
app.use(bodyParser.json());
app.listen(8099);
app.post("/register", function (req, res) {
console.log(req.body); // populated!
console.log(req.body.name);
res.send(200, req.body);
});

现在这些是我得到的结果:

如果我将请求Content-type设置为application / json,那么在服务器上我会得到一个空的请求体。

如果我将请求Content-type设置为application / x-www-form-urlencoded,那么我会得到一个填充的正文,例如{' {" name":" usernamtest","传递":" 123"}':'' }。

但是,如果我尝试打印req.body.name,我将得到未定义,这意味着正文解析器没有正确地将正文解析为JSON。

我将如何解决这个问题?我只想在示例中以这些属性的JSON对象结束。

对于那些阅读此内容的人,我感谢您的时间。 补语, 里卡多·费雷拉·达席尔瓦

1 个答案:

答案 0 :(得分:-1)

现代网络浏览器增加了一项新的安全要求,有助于遏制对来自其他域的未经授权的Web服务访问。 CSRF(或跨站点请求伪造)黑客攻击涉及从另一个域向Web服务发出HTTP请求,企图破坏服务器安全性并获取对存储在服务器上的潜在有价值数据的访问权限。如果浏览器发现请求与发出请求的网站位于同一个域,则允许发出请求。但是,如果域不同并且请求涉及除获取静态文件之外的其他内容,则浏览器首先检查从服务器访问服务的权限。

CORS标头(或跨源资源共享)是服务器应该响应的,以通知浏览器允许的内容。 CORS可以将域,http方法和特定标头列入白名单。

此过程称为CORS Preflight。

使用以下标题:

Access-Control-Allow-Origin:*

基本上是为了让所有域都可以访问。网络服务完全公开。除非您打算将您的服务公之于众,否则这可能会造成一个巨大的安全漏洞。

Access-Control-Request-Method指示允许的HTTP方法。如果允许,通常会默认允许GET请求。

Access-Control-Request-Age确定CORS Preflight有多长时间。这是以秒为单位测量的。

Access-Control-Allow-Headers指示服务器接受的任何标头。

我强烈建议您了解AJAX Hacking以及预防它的方法(如果您还没有)。