BSt*_*ill 5 javascript node.js express express-session
我试图在用户登录时为用户保存会话变量。这适用于计算机,但当我使用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 }
}))
Run Code Online (Sandbox Code Playgroud)
我使用这条路线来设置用户:
.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;
})
})
Run Code Online (Sandbox Code Playgroud)
当我控制台记录此内容时,它已正确设置。然后当我在返回时调用会话时它不存在。我尝试添加保存,但仍然无效。我还添加maxage了会话变量以使其保持活动状态 3 天,但它仍然不起作用。
您有 cookie {secure: true},它需要 HTTPS 连接以便浏览器将会话 cookie 与请求一起发送回。但建议确保它适合您的测试环境,并确保您在两台设备上都使用 HTTPS
此外,在开发或生产模式下,并在每次重新启动后更改您的秘密更改后重新启动 Express (使用函数 [crypto.randomBytes(20).toString('hex')] 而不是静态密钥),导致客户端的会话 ID重启后无效;无论如何,这都不重要,因为您没有持久会话设置,因此任何重新启动都会擦除所有会话。 如果您需要持久会话,请检查使用 memcached、数据库或文件而不是进程内存
使用 NGINX 作为前端的示例会话,当我偶然发现这一点时,我最终将其用于我的项目,我的 node.js/express 在 nginx>node.js 之间没有 SSL 设置并使用上游。
必须信任代理,我最终删除了:
// app.set('trust proxy', 1) // trust first proxy
Run Code Online (Sandbox Code Playgroud)
并将其添加到会话中
let session = require('express-session');
let memsession = require('connect-memcached')(session);
let sessionMiddleware = session({
secret : config.sessionSecret,
key : 'sid',
cookie: {
maxAge : (86400 * 30 * 1000), // 30 days
},
proxy : true,
resave : true,
rolling : true,
saveUninitialized: true,
store : new memsession({
hosts: ['127.0.0.1:11211'],
// secret: '_secret_' // Optionally use transparent encryption for memcache session data
})
});
Run Code Online (Sandbox Code Playgroud)
不过,我不确定我们是否能让所有旧版 iPad 正常工作,但我们确实让我的 iPad 正常工作并转移了项目
| 归档时间: |
|
| 查看次数: |
1067 次 |
| 最近记录: |