
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()进行解析。