HTTP 是无状态协议,简单地说,当你浏览了一个页面,然后转到同一个网站的另一个页面,服务器无法认识到这是同一个浏览器在访问同一个网站,每一次的访问,都是没有任何关系的。
Cookie 是存储于访问者的计算机中的变量,可以让同一个浏览器访问同一个域名的时候共享数据 ,在Egg中设置与获取cookie比较方便。
最简单的设置:
this.ctx.cookies.set('username','Lucy');
以上设置由于没有加任何的配置选项,当浏器关闭以后cookie就销毁了,另外这种最简单的设置也没法将cookie设置成中文。
this.ctx.cookies.set('username','露西');
Cookie设置成中文时,在浏览器中访问时会报错: argument value is invalid (code: ERR_ASSERTION)
Cookie的设置选项有很多,官网均有介绍,常见的设置如下:
'use strict';
const Controller = require('egg').Controller;
class HomeController extends Controller {
async index() {
this.ctx.cookies.set("username", '张三', {
// 设置cookie的有效期
maxAge: 1000 * 3600 * 24,
// 只允许服务端访问cookie
httpOnly: true,
// 对cookie进行签名,防止用户修改cookie
signed: true,
// 是否对cookie进行加密
// cookie加密后获取的时候要对cookie进行解密
// cookie加密后就可以设置中文cookie
encrypt: true
})
await this.ctx.render('home');
}
}
module.exports = HomeController;
Cookie 获取的代码如下:
'use strict';
const Controller = require('egg').Controller;
class NewsController extends Controller {
async index() {
// 获取cookie
// var username=this.ctx.cookies.get('username');
// 获取加密的cookie,要加上{encrypt:true}
var username = this.ctx.cookies.get('username', {
encrypt: true
});
await this.ctx.render('news', {
username: username
});
}
}
module.exports = NewsController;
Cookie清除的代码如下:
'use strict';
const Controller = require('egg').Controller;
class HomeController extends Controller {
// 退出登录
async loginOut() {
// 清理cookie
this.ctx.cookies.set('username',null);
// 重定向
this.ctx.redirect('/login');
}
}
module.exports = HomeController;
当设置的cookie为一个对象时,要将该对象进行JSON.stringify(),获取的时候再用JSON.parse()进行解析。