一.基于MySQL的实现方式

这种方式需要安装koa-session-minimal和koa-mysql-session两个依赖。

执行

npm install koa-session-minimal koa-mysql-session

项目配置:

const session = require('koa-session-minimal');
const MysqlStore = require('koa-mysql-session');
const config = require('./config/default.js'); // 数据库配置
const Koa = require('koa');
const app = new Koa(); // session存储配置
const sessionMysqlConfig = {
user: config.database.USERNAME,
password: config.database.PASSWORD,
database: config.database.DATABASE,
host: config.database.HOST,
}; // 配置session中间件
app.use(session({
key: 'USER_SID',
store: new MysqlStore(sessionMysqlConfig)
}));

这种方式会自动在数据库建立一个表:

koa2实现session的两种方式(基于Redis 和MySQL)-LMLPHP

在浏览器的cookie中会生成一个以 USER_SID 为键的cookie。通过ctx的session属性可以修改更新删除session的值。

缺点是每次对session的操作需要查询数据库,比较耗时。

二、基于Redis的实现方式

主要用到了koa-session2和ioredis。

npm install koa-session2 ioredis

项目配置:

// redis
const session = require("koa-session2");
const Store = require("./config/Store"); // 使用redis作为session存储
app.use(session({
store: new Store(),
key: "SESSIONID", // default "koa:sess"
})); config/Store.js const Redis = require("ioredis");
const { Store } = require("koa-session2");
const redisConfig = require('./redis'); class RedisStore extends Store {
constructor() {
super();
this.redis = new Redis(redisConfig);
} async get(sid, ctx) {
let data = await this.redis.get(`SESSION:${sid}`);
return JSON.parse(data);
} async set(session, { sid = this.getID(), maxAge = } = {}, ctx) {
try {
// Use redis set EX to automatically drop expired sessions
await this.redis.set(`SESSION:${sid}`, JSON.stringify(session), 'EX', maxAge / );
} catch (e) {}
return sid;
} async destroy(sid, ctx) {
return await this.redis.del(`SESSION:${sid}`);
}
} module.exports = RedisStore;

koa2实现session的两种方式(基于Redis 和MySQL)-LMLPHP

这样,每次登陆就可以通过Redis来存储会话信息,由于Redis直接是运行在内存中的,因此速度会比较快。

通过get key 即可查看相应的session信息。

05-11 09:03
查看更多