node.js - Node.js 快速会话被另一个并行会话覆盖
问题描述
我们使用 express-session 库来处理请求会话。一个会话有时会被另一个并行会话覆盖。
例如,客户端 A访问我们的应用程序并生成Session #A。之后,另一个客户端 B创建Session #B。然后客户端 A 刷新同一个应用程序,发现它的会话被更改为会话 #B。换句话说,会话#A 已被会话#B 取代。
有没有人有解决类似问题的经验?
我的部分源代码附在下面:用 TypeScript 编写。会话配置在sess.ts中定义。我使用的商店是express-oracle-session。
sess.ts
exports.configSession = () => {
let oracledb = require('oracledb');
let session = require('express-session');
let oracleDbStore = require('express-oracle-session')(session);
let sessOpts = {
checkExpirationInterval: 60000,
createDatabaseTable: true,
schema: {
tableName: 'ldap_sessions'
}
};
return new Promise((resolve, reject) => {
oracledb.getConnection('oracle_db', (err, conn) => {
if (err) {
return reject(err.message);
}
let sessionStore = new oracleDbStore(sessOpts, conn);
let sessConfig = {
secret: 'ldap secret',
resave: true,
saveUninitialized: true,
rolling: true,
cookie : {
httpOnly: false,
maxAge: 1000 * 60 * 60 * 24
store: sessionStore
};
return resolve(session(sessConfig));}
)});
};
服务器.ts
let configSess = require('./sess');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');
configSess.configSession().then((sess) => {
app.use(sess);
startServer();
});
解决方案
好吧,您说您正在使用快速会话。它使用浏览器中的 cookie 来跟踪客户端。因此,我知道客户端 A 和客户端 B 使他们的会话混淆的唯一方法是它们是否在同一个浏览器中。如果是这样,那就按预期工作。每个浏览器都有一个会话。如果您在一个窗口中创建会话,然后在另一个窗口中创建另一个会话,则第二个会话的 cookie 将覆盖第一个窗口中的 cookie,并且第二个窗口中的刷新将在第二个会话中进行。这就是快速会话的工作方式。
如果您没有为两个客户端使用相同的浏览器,那么您的 express-session 的服务器实现中存在严重错误,我们必须查看您的服务器端代码以进一步帮助解决这个问题。
如果您想在同一个浏览器中有两个单独的会话用于不同的目的(例如,一个用于管理员登录,一个用于用户登录),那么您可以在此处查看:如何在 express js 中管理多个会话。但是,这并不是说您可以拥有两个单独的客户端,每个客户端都具有相同类型的会话,并且单独的会话在同一浏览器中运行。我不认为这是 express-session 支持的东西。为此,您可能必须使用 cookie 以外的其他东西来跟踪会话密钥(也许?sessionid=xxxxx
每个 URL 中都使用旧的,但这有其自身的一系列问题,这就是为什么它很少再使用的原因)。
推荐阅读
- node.js - Browserify / Electron / AngularJS 错误:fs.existsSync 不是函数
- powershell - 在powershell中通过IP(不是主机名)重命名机器
- php - 按模式删除部分字符串
- java - 在 FIX42 中重建 QuickfixJ-ExecutionReport 的问题
- php - PHP 7.2 收到警告:A Non-Numeric Value Encountered with numeric and decimal value
- react-native - 如何使用 React Native 在两个方向(左右)构建无限滚动列表?
- ruby-on-rails - 如何使用 Rails 应用程序在 Heroku 上正确运行 Selenium Webdriver
- python - 从它的主体调用函数
- python - 如何在 Wagtail 2 Form Builder 中集成文件上传字段?
- sql - 使用 SQL 计算组中的行组合