Cookie
HTTP 请求都是无状态的,但是我们的 Web 应用通常都需要知道发起请求的人是谁。为了解决这个问题,HTTP 协议设计了一个特殊的请求头:Cookie。服务端可以通过响应头(set-cookie)将少量数据响应给客户端,浏览器会遵循协议将数据保存,并在下次请求同一个服务的时候带上(浏览器也会遵循协议,只在访问符合 Cookie 指定规则的网站时带上对应的 Cookie 来保证安全性)。
全局配置
public/user.js
const login = () => {fetch('/login', {method: 'post',headers: {'Content-type': 'application/json',},body: JSON.stringify({name: 'admin',pwd: 'admin',}),});};
controller/user.js
async login() {const { ctx } = this;const body = ctx.request.body;ctx.cookies.set('user', JSON.stringify(body));//这里就是响应ctx.body = {status: 200,data: body,};}
egg 集成了 操作 cookie 的方法在ctx 中。
还要记得配置路由
router.post('/login', controller.user.login);
开发者工具显示
响应
Cookie
想在视图中展示——即在 html 中拿到 cookies 中的数据:
<% if(user){ %>已经登录:<%= user.name %><% }else{ %>未登录<% } %>
controller/user
async index() {const { ctx } = this;// ctx.body = 'hi, user index';const user = ctx.cookies.get('user'); //**await ctx.render('user.html',{id: 100,name: 'admin',lists: ['java', 'php'],user: user ? JSON.parse(user) : null, //**},{delimiter: '%',});}
注销
async logout() {const { ctx } = this;ctx.cookies.set('user', null);ctx.body = {status: 200,};}
但此时从开发者工具中查看 cookies是实时更新了,页面却没有实时更新
再到前面 login、logout 里面的 fetch 连接then—— fetch 返回 Promise
const logout = () => {fetch('/logout', {method: 'post',headers: {'Content-type': 'application/json',},body: JSON.stringify({}),}).then(() => {location.reload();});};
ctx.cookies.set 配置项
配置时间
ctx.cookies.set('user', JSON.stringify(body), {maxAge: 1000 * 60, //cookie 保留一分钟httpOnly: true});
cookies 属性 httpOnly: √ 表示只能从服务端操作该 cookies ,而不能在前端js 操作 cookies
设置中文 Cookies
如果你直接这样
ctx.cookies.set('ch', '中文');
方法一 加密
你可以选择进行加密:
ctx.cookies.set('zh', '中文', {encrypt: true,});
加密后就不是中文了,自然就可行了
此时如果直接访问
const zh = ctx.cookies.get('zh');console.log(zh);
结果是 undefined
解密
ctx.cookies.set('zh', '中文', {encrypt: true,});const zh = ctx.cookies.get('zh', {encrypt: true,});console.log(zh);
方法二 base64 编码
class UserController extends Controller {encode(str) {return new Buffer(str).toString('base64');}decode(str) {return new Buffer(str, 'base64').toString;}//...async index(){//...ctx.cookies.set('base64', this.encode('中文base64'));const base64 = this.decode(ctx.cookies.get('base64'));console.log(base64);}
