2015-04-12 63 views
3

我知道有很多關於這個問題的問題,但我一直在研究我的問題一段時間了,沒有任何建議的解決方案似乎能解決我的問題。nodejs中的會話處理。 CORS問題

我正在開發一個web應用程序。

在前端,我將AJAX請願投入到後端,在nodejs中開發。

在後端我試圖用express.js中間件來處理用戶會話。

我無法讓會話正常工作。

我認爲這是AJAX申請的問題,但從我讀過的內容來看,我應該可以用這種請願創建cookie,所以我不知道該怎麼想。

在我的後端,我使用中間件來處理CORS問題。下面的代碼:

var enableCORS = function(req, res, next) { 
    res.header('Access-Control-Allow-Origin', '*'); 
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS'); 
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With, Cookie'); 
    res.header('Access-Control-Allow-Credentials', true); 

    // intercept OPTIONS method 
    if ('OPTIONS' == req.method) { 
     res.status(200).send(''); 
    } 
    else { 
     next(); 
    } 
}; 


app.use(enableCORS); 

然後,我想,當我處理實際的請願書來處理這樣的對話:

req.session.field = 'value'; 

的問題是,我沒有收到任何會話信息以下請願書。

我一直在密切關注這個問題。我使用的AJAX請願的一個例子是:

$.ajax({ 
      url: 'http://example.com/resource', 
      type: 'get', 
      dataType: 'json', 
      async: true, 
      crossDomain: true, 
      beforeSend: function(xhr){ xhr.withCredentials = true; }, 
      success: function(x, status, xhr){ 
       console.log(x); 
      }, 
      error: function(xhr, status, error){ } 
      }); 

我一直在看我的瀏覽器的網絡部分中的http包交換。這些請求和響應頭:

請求報頭:

Accept:application/json, text/javascript, */*; q=0.01 
Accept-Encoding:gzip, deflate 
Accept-Language:en-US,en;q=0.8,es;q=0.6 
Cache-Control:no-cache 
Connection:keep-alive 
Content-Length:29 
Content-Type:application/x-www-form-urlencoded; charset=UTF-8 
Host:example.com 
Origin:http://example.net 
Pragma:no-cache 
Referer:http://example.net/ 
User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 

響應頭:

Access-Control-Allow-Credentials:true 
Access-Control-Allow-Headers:Content-Type, Authorization, Content-Length, X-Requested-With, Cookie 
Access-Control-Allow-Methods:GET,PUT,POST,DELETE,OPTIONS 
Access-Control-Allow-Origin:* 
Connection:keep-alive 
Content-Length:96 
Content-Type:application/json; charset=utf-8 
Date:Sun, 12 Apr 2015 16:32:36 GMT 
Server:Cowboy 
Set-Cookie:connect.sid=s%3A7OCuaEWUjkpdOrxFuNo6KrtpnS_e5SpZ.S2O4PIVy2YkKuLxQ9KuzfcaszRZzqq5hjL3PfaHrQBw; Path=/; Expires=Sun, 12 Apr 2015 17:22:36 GMT 
Vary:X-HTTP-Method-Override 
Via:1.1 vegur 
X-Content-Type-Options:nosniff 
X-Powered-By:Express 

在響應中的Set-Cookie頭實際發送,但沒有創建的cookie我的瀏覽器,所以下列請願書不會隨身攜帶這些信息。

我確定這是一些愚蠢的細節,但我不能把它放在手指上。

預先感謝您!

+0

您是否嘗試過多種瀏覽器? – jwags

+0

這會有幫助嗎?目前,我正在使用谷歌瀏覽器,版本號爲39.0.2171.71 –

+0

看起來您的問題來自您使用的瀏覽器,並不尊重set-cookie響應標題。 [Here](https://code.google.com/p/chromium/issues/detail?id=158148)與某人報告OSX 10.10.1上的chrome 39的相同問題的鏈接。也許嘗試使用一些不同的瀏覽器,看看它們是否適用於其中的任何一種? – jwags

回答

0

嗯,我找到了一個替代方案,所以我回答了我自己的問題。

首先,從我讀過的內容來看,我無法做我想用cookies做的事。

因此,爲了處理會話,同時能夠通配符執行cors,我終於與JWT(JSON Web令牌)一起使用了。

這裏有一個解釋和一個很好的例子一篇文章:http://www.sitepoint.com/using-json-web-tokens-node-js/

感謝大家誰試圖幫助我在這裏。

+0

我出來了同樣的問題。但我需要實現一個消息代碼驗證功能,我需要在會話中存儲我的消息代碼,但是我無法獲取任何存儲在req.session中的內容。你有什麼想法嗎? –

+0

是的,有了這個實現(啓用CORS等),你將無法使用cookies,所以你的會話信息將不會被存儲,你會失去它。使用智威湯遜,您可以編碼您認爲對用戶會話至關重要的任何信息,並在每個請願書中對其進行解碼。希望這可以幫助! –