5、Egg.js Cookie和Session相关操作

1,332 阅读3分钟

一、Cookie的增删改查和配置加密

对Cookie的简单了解

HTTP请求是无状态的,但是在开发时,有些情况是需要知道请求的人是谁的。为了解决这个问题,HTTP协议设计了一个特殊的请求头:Cookie。服务端可以通过响应头(set-cookie)将少量数据响应给客户端,浏览器会遵循协议将数据保留,并在下一次请求同一个服务的时候带上。

1.Cookie的增加操作

其实egg已经为我们准备好了操作Cookie的方法。直接使用就可以了。 /app/controller/cookieTest.js

// 增加Cookie
  async add() {
    const { ctx } = this;
    ctx.cookies.set('user', '12345789');
    ctx.body = {
      status: 200,
      data: 'Cookie添加成功!',
    };
  }

路由配置

  router.post('/add', controller.cookieTest.add);

访问127.0.0.1:7001/add image.png

image.png

2.Cookie的删除操作

只需要将增加Cookie操作的代码进行小小改动即可实现删除Cookie。

  // 删除Cookie
  async del() {
    const { ctx } = this;
    ctx.cookies.set('user', null); //将value值设置为null,即为删除
    ctx.body = {
      status: 200,
      data: 'Cookie删除成功!',
    };
  }

3.Cookie的修改操作

还是同增加Cookie操作一样,只需修改不同的value值即可

// 修改Cookie
  async editor() {
    const { ctx } = this;
    ctx.cookies.set('user', 'asdfghj'); //修改即改变value值
    ctx.body = {
      status: 200,
      data: 'Cookie修改成功!',
    };
  }

4.Cookie的查看操作

查询Cookie要使用ctx.cookies.get( )方法

// 查询Cookie
  async show() {
    const { ctx } = this;
    const user = ctx.cookies.get('user');
    console.log(user);
    ctx.body = {
      status: 200,
      data: 'Cookie查询成功!',
    };
  }

5.Cookie的其他配置操作

ctx.cookies.set( ) 方法是有三个参数的,第一个参数是key,第二个参数是value,第三个参数就可以进行配置。比如你需要配置Cookie的有效时间,可以使用maxAge属性。(这个时间是毫秒。)

ctx.cookies.set('user', '12345789', {
      maxAge: 2000,//等2秒钟之后再刷新页面,Cookie就自动消失了,也就是到达了最大有效时间。
    });

伪造Cookie来绕过登录是黑客经常使用的一种手段,所以为了安全,Egg.js默认设置只允许服务端来操作Cookie。

比如现在你通过JS的方式document.cookie获取Cookie是不能获取的(需要在浏览器的控制台输入获取)。当我们想通过客户端操作Cookie时,可以通过下面的代码进行设置。

ctx.cookies.set('user', '12345789', {
      maxAge: 2000,
      httpOnly: false, // 为了安全性,默认选择true
    });

在Cookie里设置中文,服务端会直接报错的。比如我们在add( )方法里设置中文,然后再操作就会报错500。进行加密encrypt:true操作即可设置中文。

ctx.cookies.set('user', '你好!', {
      encrypt: true,
    });

直接通过ctx.cookies.get( )方法获取,获取的是undefind,也就是无法获取的。这时候需要再次配置解密才可以使用。

const user = ctx.cookies.get('user', {
      encrypt: true,
    });

也可以使用base64对字符串进行加密解密。

二、Session相关操作

CookieSession非常类似,Egg中的Session就存储再Cookie中,但是Session比Cookie的安全性更高。所以在开发中经常使用Cookie来保存是否登录,而用Session来保存登录信息和用户信息。公开的信息都可以临时存在Cookie里,但是隐私重要的信息,可以存在Session里,并且只允许在服务端进行操作。

1. 添加Session

//添加Session
ctx.session.username='123456' 
//修改同理,只需修改value值
//Session直接支持中文
ctx.session.username='你好!'

2. 获取Session

//获取Session
  const username= ctx.session.username

3. 删除Session

//删除Session
ctx.session.username=null

4. Session相关项配置

配置Session的一些选项,需要到config.default.js文件中进行配置。

config.session = {
    key :"Test_SESS",   // 设置Key的默认值
    httpOnly:true,      // 设置服务端操作
    maxAge:1000*60  ,   // 设置最大有效时间
    renew: true,        // 页面有访问动作自动刷新session 
}

学习日期:2021/12/24

视频参考www.bilibili.com/video/BV1s3…

文档参考jspang.com/detailed?id…

仅供个人学习和记录