每次请求都会重置 Express 会话
Express session resets on every request
我在 localhost:8080
上有一个 vue 前端,在 localhost:1234
上有一个服务器
我没有使用 https。
每次 vue 应用程序切换页面或重新加载时,会话都会重置。我在网上遵循了各种解决方案,例如: and
然而无济于事。
这是我的会话配置:
// app.set('trust proxy', 1 );
app.use(session({
secret: sessionServerToken,
resave: true,
saveUninitialized: true,
cookie: {
// Session expires after 1 hour of inactivity.
expires: 60 * 1000 * 60,
// sameSite: 'none',
secure: false
}
}));
这是我的授权码:
router.post('/auth', (req, res) => {
console.log(req.body);
const session = req.session;
AuthManager.authenticate(req.body.user, req.body.pass).then(response => {
session.loggedIn = true;
session.userID = response.user.id;
res.status(200).send(response);
res.end();
}).catch(response => {
res.status(response.statusCode).send({ message: response.message });
});
});
Cookie 不会在不同来源之间共享。会话数据不会共享到前端应用程序,这就是为什么它的行为就像正在重置会话一样。
如果你构建你的 Vue 应用程序并通过 Express 提供它,你将不会遇到这个问题,会话将按预期共享。
但是对于开发来说,这会很烦人,您可以通过 Express 代理 front-end 应用程序。
作为一个最小的例子,您可以试试下面的代码。 运行 你的 Vue 应用程序像往常一样,然后 运行 服务器具有以下内容
const express = require('express');
const session = require("express-session");
const proxy = require('express-http-proxy');
const app = express();
app.use(
session({
secret: 'keyboard cat',
cookie: {
maxAge: 60000
},
value: 0
})
);
app.get('/api', (req, res) => {
req.session.value ++;
res.json({
session: req.session.value
});
});
app.use(proxy('http://127.0.0.1:8080'));
app.listen(4001, '0.0.0.0', () => {
console.log('Server is running at http://127.0.0.1:1234');
});
Vue 应用程序内容将在 http://127.0.0.1:1234
上可用,如果您导航 http://127.0.0.1:1234/api
并刷新几次,您将看到会话值存在并且不会重置。
我在 localhost:8080
上有一个 vue 前端,在 localhost:1234
上有一个服务器
我没有使用 https。
每次 vue 应用程序切换页面或重新加载时,会话都会重置。我在网上遵循了各种解决方案,例如:
然而无济于事。
这是我的会话配置:
// app.set('trust proxy', 1 );
app.use(session({
secret: sessionServerToken,
resave: true,
saveUninitialized: true,
cookie: {
// Session expires after 1 hour of inactivity.
expires: 60 * 1000 * 60,
// sameSite: 'none',
secure: false
}
}));
这是我的授权码:
router.post('/auth', (req, res) => {
console.log(req.body);
const session = req.session;
AuthManager.authenticate(req.body.user, req.body.pass).then(response => {
session.loggedIn = true;
session.userID = response.user.id;
res.status(200).send(response);
res.end();
}).catch(response => {
res.status(response.statusCode).send({ message: response.message });
});
});
Cookie 不会在不同来源之间共享。会话数据不会共享到前端应用程序,这就是为什么它的行为就像正在重置会话一样。
如果你构建你的 Vue 应用程序并通过 Express 提供它,你将不会遇到这个问题,会话将按预期共享。
但是对于开发来说,这会很烦人,您可以通过 Express 代理 front-end 应用程序。
作为一个最小的例子,您可以试试下面的代码。 运行 你的 Vue 应用程序像往常一样,然后 运行 服务器具有以下内容
const express = require('express');
const session = require("express-session");
const proxy = require('express-http-proxy');
const app = express();
app.use(
session({
secret: 'keyboard cat',
cookie: {
maxAge: 60000
},
value: 0
})
);
app.get('/api', (req, res) => {
req.session.value ++;
res.json({
session: req.session.value
});
});
app.use(proxy('http://127.0.0.1:8080'));
app.listen(4001, '0.0.0.0', () => {
console.log('Server is running at http://127.0.0.1:1234');
});
Vue 应用程序内容将在 http://127.0.0.1:1234
上可用,如果您导航 http://127.0.0.1:1234/api
并刷新几次,您将看到会话值存在并且不会重置。