2015-12-30 41 views
0

我发布这个题目关于标题建议的问题。我看到有关空请求组织的其他几个问题,但没有一个对我有帮助。希望如果我发布自己的代码,有人可以给我一个很好的提示。节点js与CORS和JSON空请求正文

基本上我有一个客户端使用JavaScript来使CORS HTTPRequests到Node.js服务器。通常这些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); 
}); 

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

如果我设置请求内容类型为application/JSON,然后在服务器上,我得到一个空的请求主体。

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

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

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

对于那些阅读本文,我感谢您的时间。 补全, 里卡多费雷拉达席尔瓦

+0

你确定代码不*工作吗?试了一下,我得到了预期的结果(打印到控制台名称)。你是否正确地从输入中获取数据?您可以尝试清理您的XHR代码:https://jsbin.com/revovemepu/edit?js – adrianp

+0

是的,我确定客户端与我的教授已经完成的测试服务器完全匹配,但它不起作用与我的。如果我按照原样运行代码,当我打印req.body时,我得到了{},这是一个空的主体。 –

+0

http:// xxxx:8099/register中的** xxxx **是什么?您是否正在提出跨域请求?您服务嵌入客户端JS的HTML页面的域是否与您制作XHR的域不同? – adrianp

回答

-1

现代网络浏览器增加了一个新的安全要求,有助于遏制从另一个域的未经授权的访问您的web服务。 CSRF(或跨站点请求伪造)黑客攻击涉及从另一个域向Web服务发出HTTP请求,企图破坏服务器安全并访问存储在服务器上的潜在重要数据。如果浏览器发现请求与请求的网站位于同一个域,那么它允许请求被创建。但是,如果域名不同且请求涉及获取静态文件以外的内容,则浏览器首先检查是否有权从服务器访问该服务。

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

这个过程被称为CORS预检。

使用下面的头:

访问控制允许来源:*

基本上可让所有域访问。网络服务完全公开。除非您打算将您的服务公开,否则可能会留下严重的安全漏洞。

访问控制请求方法指示允许哪些HTTP方法。如果允许,GET请求通常默认是允许的。

Access-Control-Request-Age确定CORS预检适合多长时间。这是以秒为单位测量的。

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

我强烈建议您学习有关AJAX Hacking的知识以及如何防止它(如果您还没有的话)。