我知道有很多关于这个问题的问题,但我现在一直在研究我的问题,而且所提出的解决方案都没有解决我的问题。
我正在开发一个Web应用程序。
在前端,我将AJAX请求投向后端,在nodejs中开发。
在后端,我尝试使用express.js中间件处理用户会话。
我无法使会话有效。
我认为这是AJAX请愿书的一个问题,但从我所读过的内容来看,我应该可以创建这样的请愿书,所以我不知道该怎么想。
在我的后端,我使用中间件来处理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 :(得分:0)
好吧,我找到了另一种选择,所以我回答了我自己的问题。
首先,从我读过的内容来看,没有办法做我想做的饼干。
因此,为了在能够使用通配符实现cors的同时处理会话,我终于使用了JWT(JSON Web令牌)。
这是一篇文章,其中有一个解释和一个很好的例子:http://www.sitepoint.com/using-json-web-tokens-node-js/
感谢所有试图帮助我的人。