eggjs cookie 文档
https://eggjs.org/zh-cn/core/cookie-and-session.html
image.png

cookie应用场景

  1. 用户登录成功后,设置 cookie
  2. 用户退出,清除 cookie

Cookies

eggjs ctx上下文集成了 cookie,直接使用 ctx.cookies的 get & set方法来获取 cookie

Controller里面,用 ctx.cookies 获取 cookie
ctx.cookie.set()
ctx.cookie.get()

ctx.cookie.set() 设置cookie

  1. 'use strict';
  2. const { Controller } = require('egg');
  3. class UserController extends Controller {
  4. // 设置 cookie
  5. async login() {
  6. const { ctx } = this;
  7. ctx.cookies.set('user', JSON.stringify({ id: 100 }));
  8. ctx.cookies.set('user', JSON.stringify({ id: 100 }), {
  9. maxAge: 1000 * 60 * 10, // 10分钟有效期
  10. httpOnly: true, // 默认true 前端无法修改 cookie
  11. });
  12. }
  13. // 获取 cookie
  14. async list() {
  15. const { ctx } = this;
  16. const user = ctx.cookies.get('user')
  17. }
  18. // 清除 cookie
  19. async logout() {
  20. const { ctx } = this;
  21. const user = ctx.cookies.set('user', null)
  22. }
  23. }

cookie 中文要编码

直接设置中文 cookie,会报错,解决

  1. encrypt 加密
  2. base64转义 ```javascript ctx.cookies.set(‘user’, ‘用户’) 设置中文 cookie 报错,解决:加密设置

// 加密存储中文 ctx.cookies.set(‘user’, ‘用户’, { encrypt: true })

// 获取时,也要进行加解密,不解密获取的值是 undefined ctx.cookies.get(‘user’, { encrypt: true })

  1. <a name="LvT05"></a>
  2. ### cookie base64加密解密
  3. 设置 base64格式的 cookie
  4. ```javascript
  5. base64 加密
  6. encode(str) {
  7. return new Buffer(str).toString('base64')
  8. }
  9. base64 解密
  10. decode(str) {
  11. return new Buffer(str, 'base64').toString()
  12. }
  13. ctx.cookies.set('base64', encode('用户'))
  14. decode(ctx.cookies.get('base64'))

Session

session与 cookie 的区别

session基于 cookie实现,session保存用户登录信息,
session安全性比 cookie高
session有服务端进行操作
image.png

ctx.session

session 默认支持中文
maxAge时间过期,会自动清除 session

  1. 设置 session
  2. ctx.session.user = {id: 100}
  3. 获取 session
  4. const sess = ctx.session.user
  5. 清除 session
  6. ctx.session.user = null;
  7. class UserController extends Controller {
  8. // 设置 session
  9. async login() {
  10. const { ctx } = this;
  11. const userData = { id: 100 }
  12. ctx.cookies.set('user', JSON.stringify(userData), {
  13. maxAge: 1000 * 60 * 10, // 10分钟有效期
  14. httpOnly: true, // 默认true 前端无法修改 cookie
  15. });
  16. // 设置 session
  17. ctx.session.user = userData
  18. }
  19. // 获取 session
  20. async list() {
  21. const { ctx } = this;
  22. const user = ctx.session.user
  23. }
  24. async logout() {
  25. const { ctx } = this;
  26. ctx.cookies.set('user', null)
  27. // 清除 session
  28. ctx.session.user = null;
  29. }
  30. }

eggjs 对session会默认生成 EGG_SESS key值
EGG_SESS就是 session

config.session配置

config/config.default.js

  1. // 设置 session的 key
  2. config.session = {
  3. key: 'QIXIU_SESS',
  4. httpOnly: true,
  5. maxAge: 1000 * 60, // 60秒,默认单位 ms
  6. renew: true, // 默认 false,会自动刷新 session
  7. };

Session扩展

默认 session会保存在 cookie里面的某个字段中,
随着 session的增多,cookie也会变得越来越多,直到浏览器拒绝设置 session,浏览器就会报错

将 session保存到内存中

将 session保存到内存中以后,浏览器cookie的大小是不变的。

src/app.js

  1. module.exports = app => {
  2. const store = {};
  3. // 将 session保存到内存中
  4. app.sessionStore = {
  5. async get(key) {
  6. return store[key];
  7. },
  8. async set(key, value, maxAge) {
  9. store[key] = value;
  10. store.maxAge = maxAge;
  11. },
  12. async destroy(key) {
  13. store[key] = null;
  14. },
  15. };
  16. };

sessionStore.jpg