eggjs cookie 文档
https://eggjs.org/zh-cn/core/cookie-and-session.html
cookie应用场景
- 用户登录成功后,设置 cookie
 - 用户退出,清除 cookie
 
Cookies
eggjs ctx上下文集成了 cookie,直接使用 ctx.cookies的 get & set方法来获取 cookie
Controller里面,用 ctx.cookies 获取 cookie
ctx.cookie.set()
ctx.cookie.get()
ctx.cookie.set() 设置cookie
'use strict';const { Controller } = require('egg');class UserController extends Controller {// 设置 cookieasync login() {const { ctx } = this;ctx.cookies.set('user', JSON.stringify({ id: 100 }));ctx.cookies.set('user', JSON.stringify({ id: 100 }), {maxAge: 1000 * 60 * 10, // 10分钟有效期httpOnly: true, // 默认true 前端无法修改 cookie});}// 获取 cookieasync list() {const { ctx } = this;const user = ctx.cookies.get('user')}// 清除 cookieasync logout() {const { ctx } = this;const user = ctx.cookies.set('user', null)}}
cookie 中文要编码
直接设置中文 cookie,会报错,解决
- encrypt 加密
 - base64转义 ```javascript ctx.cookies.set(‘user’, ‘用户’) 设置中文 cookie 报错,解决:加密设置
 
// 加密存储中文 ctx.cookies.set(‘user’, ‘用户’, { encrypt: true })
// 获取时,也要进行加解密,不解密获取的值是 undefined ctx.cookies.get(‘user’, { encrypt: true })
<a name="LvT05"></a>### cookie base64加密解密设置 base64格式的 cookie```javascriptbase64 加密encode(str) {return new Buffer(str).toString('base64')}base64 解密decode(str) {return new Buffer(str, 'base64').toString()}ctx.cookies.set('base64', encode('用户'))decode(ctx.cookies.get('base64'))
Session
session与 cookie 的区别
session基于 cookie实现,session保存用户登录信息,
session安全性比 cookie高
session有服务端进行操作
ctx.session
session 默认支持中文
maxAge时间过期,会自动清除 session
设置 sessionctx.session.user = {id: 100}获取 sessionconst sess = ctx.session.user清除 sessionctx.session.user = null;class UserController extends Controller {// 设置 sessionasync login() {const { ctx } = this;const userData = { id: 100 }ctx.cookies.set('user', JSON.stringify(userData), {maxAge: 1000 * 60 * 10, // 10分钟有效期httpOnly: true, // 默认true 前端无法修改 cookie});// 设置 sessionctx.session.user = userData}// 获取 sessionasync list() {const { ctx } = this;const user = ctx.session.user}async logout() {const { ctx } = this;ctx.cookies.set('user', null)// 清除 sessionctx.session.user = null;}}
eggjs 对session会默认生成 EGG_SESS key值
EGG_SESS就是 session
config.session配置
config/config.default.js
// 设置 session的 keyconfig.session = {key: 'QIXIU_SESS',httpOnly: true,maxAge: 1000 * 60, // 60秒,默认单位 msrenew: true, // 默认 false,会自动刷新 session};
Session扩展
默认 session会保存在 cookie里面的某个字段中,
随着 session的增多,cookie也会变得越来越多,直到浏览器拒绝设置 session,浏览器就会报错
将 session保存到内存中
将 session保存到内存中以后,浏览器cookie的大小是不变的。
src/app.js
module.exports = app => {const store = {};// 将 session保存到内存中app.sessionStore = {async get(key) {return store[key];},async set(key, value, maxAge) {store[key] = value;store.maxAge = maxAge;},async destroy(key) {store[key] = null;},};};

