我在 NodeJS 中设置用户 session 时遇到了一些噩梦。我已经用谷歌搜索了它的生活并阅读了这里的大量文章,但没有一个解决方案适合我。
我的设置:
app.use(cookieParser());
app.use(session({
pool: true,
key: 'cgtracker.cookie',
resave: false,
saveUninitialized: false,
secret: '1234567890QWERTY',
cookie: {maxAge: 100000},
store: new MySQLStore(options),
}));
我正在使用 MySQLStore('express-mysql-session')。这已链接到我的数据库并且按预期工作。运行此 ->
router.post('/Login', function (req, res) {
logger.log("info", "Attempting Login for user: " + req.body.Username);
req.session.username = req.body.Username;
res.send('Created session for: ' + req.body.Username);
在我的 session 表中为已过期的 session 创建一个条目。
| 2gbIWNuFVcE3GmjrFMEctdZlvBMufqiN | 1457713316 | {"cookie":{"originalMaxAge":100000,"expires":"2016-03-11T16:21:55.580Z","httpOnly":t rue,"path":"/"},"username":"chris.rayner"}
我的问题是我无法在任何其他函数中检索任何 session 。 这里进行一个简单的测试:
router.get('/', function (req, res) {
logger.log("info", "Current Session: " + JSON.stringify(req.session));
}
我收到:
Current Session: {\"cookie\":{\"originalMaxAge\":100000,\"expires\":\"2016-03-11T16:24:15.212Z\",\"httpOnly\":true,\"path\":\"/\"}}","timestamp":"2016-03-11T16:22:35.212Z"}`
我的 session 数据哪里去了?!
我觉得我错过了一些明显的东西,但我尝试了很多研究的变体,我变得有点迷失了。
我的浏览器 cookie 构造正确,但该值似乎与 session 表中存储的任何 SessionID 都不相关。
任何帮助/想法/建议将不胜感激!
克里斯
最佳答案
找到解决方案!
当发布到“未知”域时,Chrome(可能还有 Firefox,但未经测试)默认情况下会阻止 POST 请求中的 Cookie。客户端 CORS 中的一些安全功能...
要修复此服务器端: - 使用授权来源更新 Cors,供浏览器检查。
app.use(cors({
origin: config.origin, *(我使用一个数组来表示多个允许来源)*
凭证:真实
}));
要修复此客户端: 将其添加到函数的 POST header 中的选项中。
xhrFields: {
withCredentials: true
}
或
将其添加到类的模型构造函数中。
$.ajaxPrefilter( 函数( 选项,originalOptions,jqXHR ) {
选项.xhrFields = {
withCredentials: true
};
});
此后,POST 请求中生成的 Cookie 成功“粘”到浏览器, session 功能就可以使用了!
好痛苦啊! 希望这个解决方案可以帮助其他人在他们的项目上节省一些时间!
关于java - Node JS session 不持久,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35945738/