我在我的应用程序中使用 express-session 和 express-mysql-session 来生成会话并将它们存储在 mysql 数据库中。会话存储在称为会话的表中。
const express = require('express');
const session = require('express-session');
const MySQLStore = require('express-mysql-session')(session);
const cookieParser = require('cookie-parser');
const connection = {
host: process.env.MYSQL_HOST,
port: process.env.MYSQL_PORT,
user: process.env.MYSQL_USER,
password: process.env.MYSQL_PASSWORD,
database: process.env.MYSQL_DATABASE,
};
const sessionStore = new MySQLStore(connection);
module.exports = app => {
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(
session({
name: 'sessID',
secret: 'someSecret',
resave: false,
store: sessionStore,
saveUninitialized: true,
})
);
会话存储在表中,但它的值与客户端或控制台中的会话值不同。
示例:客户端和控制台的解码值是s:fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4.eKUawMNIv7ZtXSweWyIEpfAUnfRd6/rPWr+PsjuGCVQ
,但是存储的值是fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4
。它不完整,我不知道发生了什么。
显示创建表会话:
sessions CREATE TABLE `sessions` (
`session_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
NOT NULL,
`expires` int unsigned NOT NULL,
`data` mediumtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin,
PRIMARY KEY (`session_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
答案 0 :(得分:1)
存储在客户端 cookie 中的值由两部分组成:
fiNdSdb2_K6qUB_j3OAqhGLEXdWpZkK4
)eKUawMNIv7ZtXSweWyIEpfAUnfRd6/rPWr+PsjuGCVQ
的 HMAC 签名。这是为了确保会话 ID 的完整性,不需要存储在数据库中。它由 express-session
(内部使用 node-cookie-signature
package)并使用传递的 secret
参数在服务器端生成。因此 express-session
使用 cookie 名称的第二部分(点之后)来验证第一部分,然后将其删除。