2015-04-12 31 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,所以你的会话信息将不会被存储,你会失去它。使用智威汤逊,您可以编码您认为对用户会话至关重要的任何信息,并在每个请愿书中对其进行解码。希望这可以帮助! –