2015-12-30 38 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的知識以及如何防止它(如果您還沒有的話)。