zoukankan      html  css  js  c++  java
  • koa2实现session的两种方式(基于Redis 和MySQL)

    一.基于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)
    }));

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

    在浏览器的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(24), maxAge = 1000000 } = {}, ctx) {
            try {
                // Use redis set EX to automatically drop expired sessions
                await this.redis.set(`SESSION:${sid}`, JSON.stringify(session), 'EX', maxAge / 1000);
            } catch (e) {}
            return sid;
        }
     
        async destroy(sid, ctx) {
            return await this.redis.del(`SESSION:${sid}`);
        }
    }
     
    module.exports = RedisStore;

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

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

  • 相关阅读:
    关于 Wordpress安装时出现“Warning: Cannot modify header information – headers already sent by….”
    C#、.Net经典面试题集锦(二)
    .net 中的事务总结
    什么是webservice
    Web Service与 .NET Remoting
    动态语句exec与sp_executesql执行计划区别
    SQL2005以上版本派生表更新
    清理sql server 2005 服务器名称列表
    如何卸载VS2008
    [怎樣處理]SQL2008、SQL2005類型判斷出錯
  • 原文地址:https://www.cnblogs.com/cangqinglang/p/10266952.html
Copyright © 2011-2022 走看看