Eggjs笔记:cookie和session

本文深入讲解了Cookie和Session的工作原理及应用,包括它们在Egg.js中的设置与获取方法,探讨了数据持久化、安全性及中文Cookie的处理,对比了Cookie与Session的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值