具有 CORS 和 JSON 的节点 js 空请求 body

Node js empty request body with CORS and JSON

我正在 post 关于标题所暗示的问题的主题。我已经看到其他几个关于空请求主体的问题,但其中 none 对我有帮助。希望如果我 post 我自己的代码有人能给我一个好的提示。

基本上我有一个客户端使用 javascript 向 Node.js 服务器发出 CORS HTTPRequests。通常这些 HTTPRequests 是 posts of JSONs objects.

s

这里是客户端的示例代码。

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,那么在服务器上我得到一个空请求 body。

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

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

我将如何解决这个问题?我只想在示例中得到这些属性的 JSON object。

对于那些阅读本文的人,我感谢你们的时间。 补充, 里卡多·费雷拉·达席尔瓦

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

CORS headers(或跨源资源共享)是服务器应该响应以通知浏览器允许的内容。 CORS 可以将域、http 方法和特定的 headers.

列入白名单

此过程称为 CORS 预检。

使用以下 header:

Access-Control-Allow-Origin: *

基本上使所有域都可以访问。 Web 服务完全 public。这可能会留下一个巨大的安全漏洞,除非您希望您的服务成为 public.

Access-Control-Request-Method 表示允许哪些 HTTP 方法。如果允许,通常默认允许 GET 请求。

Access-Control-Request-Age 确定 CORS Preflight 的适用时间。这是以秒为单位的。

Access-Control-Allow-Headers 表示服务器接受的任何 header。

我强烈建议您了解 AJAX 黑客攻击及其预防方法(如果您还没有)。