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 {
// 设置 cookie
async 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
});
}
// 获取 cookie
async list() {
const { ctx } = this;
const user = ctx.cookies.get('user')
}
// 清除 cookie
async 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
```javascript
base64 加密
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
设置 session
ctx.session.user = {id: 100}
获取 session
const sess = ctx.session.user
清除 session
ctx.session.user = null;
class UserController extends Controller {
// 设置 session
async login() {
const { ctx } = this;
const userData = { id: 100 }
ctx.cookies.set('user', JSON.stringify(userData), {
maxAge: 1000 * 60 * 10, // 10分钟有效期
httpOnly: true, // 默认true 前端无法修改 cookie
});
// 设置 session
ctx.session.user = userData
}
// 获取 session
async list() {
const { ctx } = this;
const user = ctx.session.user
}
async logout() {
const { ctx } = this;
ctx.cookies.set('user', null)
// 清除 session
ctx.session.user = null;
}
}
eggjs 对session会默认生成 EGG_SESS key值
EGG_SESS就是 session
config.session配置
config/config.default.js
// 设置 session的 key
config.session = {
key: 'QIXIU_SESS',
httpOnly: true,
maxAge: 1000 * 60, // 60秒,默认单位 ms
renew: 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;
},
};
};