Node.js 如何在跨源请求中保留会话数据?
我刚开始使用Express和Connect,所以我希望我正在做一些愚蠢的事情,有一个简单的解决方案 基本上,我有一个用户使用角色登录的页面。为了验证身份验证尝试,我使用。据推测,此模块将用户的已验证电子邮件地址保存在会话变量(默认情况下为req.session.email)中 现在,在登录后,用户可以发布评论,该评论将与用户登录的电子邮件地址一起保存。当为表单提供服务的服务器与处理评论发布的服务器相同时,这可以正常工作。但是,当它们不同时(假设用户在Node.js 如何在跨源请求中保留会话数据?,node.js,session,express,connect,cors,Node.js,Session,Express,Connect,Cors,我刚开始使用Express和Connect,所以我希望我正在做一些愚蠢的事情,有一个简单的解决方案 基本上,我有一个用户使用角色登录的页面。为了验证身份验证尝试,我使用。据推测,此模块将用户的已验证电子邮件地址保存在会话变量(默认情况下为req.session.email)中 现在,在登录后,用户可以发布评论,该评论将与用户登录的电子邮件地址一起保存。当为表单提供服务的服务器与处理评论发布的服务器相同时,这可以正常工作。但是,当它们不同时(假设用户在http://localhost:8001,而
http://localhost:8001
,而浏览器随后向http://localhost:8000
应保存注释),req.session.email值突然变为未定义
我认为我正确设置了跨源资源共享。表单被发送(使用jQuery):
(注意xhrField:{withCredentials:true}
——传递会话cookie,我通过检查网络请求来验证它。)
服务器设置(我认为)正确的CORS头:
res.header('Access-Control-Allow-Origin', 'http://localhost:8001');
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');
res.header('Access-Control-Allow-Credentials', 'true');
当我添加console.log(req.cookie)
时,我会看到sessionId
cookie,它的值与POST请求中发送的值相同
但是:console.log(req.session.email)
显示跨来源请求的undefined
——同样,当请求来自同一来源时,它可以正常工作
我做错了什么?我发现了我的问题:我忘了发送带有身份验证请求的cookies。因此,Express服务器在登录时无法识别当前用户的会话,因此无法将用户数据保存到会话 解决方案是使用
withCredentials
标志发送角色断言请求,如下所示:
var response = $.ajax(assertionUrl + '/verify', {
data: {assertion: assertion},
type: 'POST',
xhrFields: {withCredentials: true}
});
(我不认为任何人会遇到完全相同的问题,但以防万一……对于那些希望用角度实现解决相同问题的人来说。您可以使用以下方式配置$http以发送cookies:
.config(function ($routeProvider, $httpProvider) {
$httpProvider.defaults.withCredentials = true;
//rest of route code
您将console.log语句放在哪里?Express.use()语句是什么样子的?您是否在express pesona中间件有机会运行和更新会话信息之前运行console.log?console.log()位于express应用程序中,在使用()初始化角色和注释处理模块后被调用--当请求来自同一来源时,他们输出了正确的值。我再也找不到原始链接了。我已经把它从我的帖子上删除了
.config(function ($routeProvider, $httpProvider) {
$httpProvider.defaults.withCredentials = true;
//rest of route code