Cookie
-
https://eggjs.org/zh-cn/core/cookie-and-session.html
-
cookie 是存储于访问者的计算机中的变量。可以让我们用同一个浏览器访问同一个域
名的时候共享数据 -
HTTP 是无状态协议。简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页
面,服务器无法认识到这是同一个浏览器在访问同一个网站。每一次的访问,都是没有任何
关系的 -
实现同一个浏览器访问同一个域的时候,不同页面数据共享
-
实现数据持久化,默认情况下,cookie当浏览器关闭就销毁了,需要设置过期时间
Egg.js 中 Cookie 的设置和获取
-
Cookie 设置语法: ctx.cookies.set(key, value, options)
- $
this.ctx.cookies.set('name','zhangsan');
- $
-
Cookie 获取语法:ctx.cookies.get(key, options)
- $
this.ctx.cookies.get('name')
- $
-
清除 Cookie
- $
this.ctx.cookies.set('name',null);
- 或者设置 maxAge 过期时间为 0
- $
Egg.js 中 Cookie 参数 options
-
https://eggjs.org/en/core/cookie-and-session.html#container
-
设置 cookie 建议的写法:
ctx.cookies.set(key, value, { maxAge:24 * 3600 * 1000, httpOnly: true, // by default it's true encrypt: true, // cookies are encrypted during network transmission 对cookie进行加密,获取时要对cookie进行解密操作 signed: true, // 对cookie进行签名,防止用户修改,用户修改后,则失效 }); // 下面是解密操作 ctx.cookies.get('frontend-cookie', { encrypt: true }); // 清理cookie方式1 ctx.cookies.set('userinfo', null); // 清理cookie方式2 没必要用 ctx.cookies.set('userinfo', null, { maxAge: 0 }); // 页面跳转 ctx.redirect('/');
Egg.js 中设置中文 Cookie
1 ) 方式1
设置base64位的可以设置中文
console.log(new Buffer('hello, world!').toString('base64'));
// 转换成 base64 字符串:aGVsbG8sIHdvcmxkIQ==
console.log(new Buffer('aGVsbG8sIHdvcmxkIQ==', 'base64').toString());
// 还原 base64 字符串:hello, world!
2 ) 方式2
加密后即可设置中文
ctx.cookies.set(key, value, {
maxAge:24 * 3600 * 1000,
httpOnly: true, // by default it's true
encrypt: true, // cookies are encrypted during network transmission
});
Session
- session 是另一种记录客户状态的机制
- 不同的是 Cookie 保存在客户端浏览器中,而session 保存在服务器上,但是基于cookie, 过期时间也是基于cookie
Session 的工作流程
- 当浏览器访问服务器并发送第一次请求时,服务器端会创建一个 session 对象,生成一个类似于 key, value 的键值对
- 然后将 key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带 key(cookie),找到对应的 session(value)
Egg.js 中 session 的使用
egg.js 中 session 基于 egg-session 内置了对 session 的操作
1 ) 设置
this.ctx.session.userinfo={
name:'张三',
age:'20'
}
2 ) 获取
var userinfo=this.ctx.session.userinfo
3 ) Session 的默认设置
exports.session = {
key: 'EGG_SESS',
maxAge: 24 * 3600 * 1000, // 1 day
httpOnly: true,
encrypt: true
};
不推荐的设置:单独设置
ctx.session.maxAge=1000
应该在config中进行配置
Session 在 config.default.js 中的配置
config.session={
key:'SESSION_ID',
maxAge:864000,
httpOnly: true,
encrypt: true,
renew: true // 延长会话有效期, 每次刷新页面,session都会被延期相应的时间
}
Cookie 和 Session 区别
- cookie 数据存放在客户的浏览器上,session 数据放在服务器上
- cookie 相比 session 没有 session 安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE欺骗
- session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用 COOKIE
- 单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie