我正在尝试为用户登录时保存一个会话变量。这可以在计算机上使用,但是当我使用 Safari 或 Chrome 在 iPad 上尝试时,它不会保存。
在这里设置会话:
app.set('trust proxy', 1)
app.use(session({
secret: crypto.randomBytes(20).toString('hex'),
resave: false,
duration: 60 * 60 * 1000,
activeDuration: 10 * 60 * 1000,
saveUninitialized: false,
cookieName: 'session',
cookie: { secure: true }
}))
我使用此路由来设置用户:
.get('/checkLogin', (req,res) => {
const loginCred = req.query;
db.any('SELECT * FROM users WHERE user_name = $1 AND password = $2 LIMIT 1', [loginCred[0], loginCred[1]])
.then(function (user) {
req.session.user = user;
req.session.save();
res.end(JSON.stringify(user));
})
.catch(function (err) {
throw err;
})
})
当我在控制台上登录时,它已正确设置。
然后,当我调用返回的会话时,它不存在。我试图添加保存,但仍然没有用。我还向会话变量中添加了maxage
,以使其保持活动状态3天,但仍然无法正常工作。
答案 0 :(得分:2)
您的Cookie为 {secure:true} ,它需要HTTPS连接,浏览器才能将会话Cookie和请求一起发送回去。但是建议您确保它适合您的测试环境,确保两个设备上都使用HTTPS
还具有开发或生产模式,并在进行更改后重新启动express每次重新启动后的秘密更改(通过使用函数[crypto.randomBytes(20).toString('hex')]而不是静态密钥) 导致重新启动后客户端的会话ID无效;无论如何,这都不重要,因为您没有设置持久性会话,因此任何重新启动都会擦除所有会话。 如果您需要持久会话,请使用memcached,数据库或文件而不是进程内存进行签入
答案 1 :(得分:0)
尝试放入resave: true
。如果可行,您可能需要更改 saveUninitialized