node.js 中 session(基于mongodb和express, 并且前后端代码分离,通过http请求连接) 问题
前言
此项目基于前后端分离, express, mongoose, http通讯, session存储在mongodb中 (下文有源码),
mongodb连接良好
问题
session存储在mongodb中,并且前后端代码分离, 造成 cookie
中的 connect.sid
(express-session中默认cookie的name是:connect.sid) 每次请求都发生变化(可能我对cookie的了解不深, 没真正弄懂吧), 这样造成我在登录完成后( login.js
), 设置了了 req.session.current_user = 'ly'
,并且在当前请求中 console.dir(req.session)
是可以打印出 current_user
, 但是当我发起另外一个请求( article.js
)时, 发现 console.dir(req.session)
中压根就 不存在 current_user
。
初步怀疑是 cookie 的域设置的问题(即是在不在当前域名下有效), 我前端的域名为 http://localhost:8080/login
、http://localhost:8080/article/lists
, 后端的域名为 http://localhost:3000/user/login
、 http://localhost:3000/article/lists
请问我的cookie中的 path
和 domain
分别设置为什么才是合法的?暂时代码如下:
app.use(session({
store: new MongoStore({ mongooseConnection: mongoose.connection }),
secret: 'ly',
resave: false,
saveUninitialized: true,
cookie: {
path: '/',
domain: 'localhost',
// secure: false,
// maxAge: half_hour
secure: false,
// expires: false,
maxAge: null
}
}))
源码
app.js(入口文件):
import cookieParser from 'cookie-parser'
import session from 'express-session'
const MongoStore = require('connect-mongo')(session)
import mongoose from 'mongoose'
// 支持跨域
app.use(require('cors')())
app.use(cookieParser())
app.use(session({
store: new MongoStore({ mongooseConnection: mongoose.connection }),
secret: 'ly',
resave: false,
// 表示cookie的name,默认cookie的name是:connect.sid
// name: 'connect.sid',
saveUninitialized: true,
cookie: {
// secure: false,
// maxAge: half_hour
// 新添加的
path: '/',
domain: 'localhost',
secure: false,
expires: false,
maxAge: null
}
}))
login.js:
function login (req, res, next) {
req.session.current_user = 'ly'
// 这里可以打印出 current_user: 'ly'
console.dir(req.session)
// 输出:
// Session {
// cookie:
// { path: '/',
// _expires: null,
// originalMaxAge: null,
// httpOnly: true,
// secure: false },
// current_user: 'ly' }
}
article.js
function lists (req, res, next) {
// 这里 current_user 消失了
console.dir(req.session)
// 输出:
// Session {
// cookie:
// { path: '/',
// _expires: null,
// originalMaxAge: null,
// httpOnly: true,
// secure: false } }
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
“造成 cookie 中的 connect.sid(express-session中默认cookie的name是:connect.sid) 每次请求都发生变化”的原因很可能是因为cookie丢失或过期了。
在这个情景下过期很可能expires和maxage的设置问题。
可以试试根据https://github.com/expressjs/...去配置cookie的行为。
遇到了相同的问题,似乎是跨域问题