egg中的cookie和session

egg中的cookie和session

在我前几篇博客当中有说明了一下express框架当中的session,这篇就来讲解一下egg中的cookie和session。

session

session本来也算是cookie的一种,但是session时存储在服务器上面的,一般都是放在redis数据库中,这种内存型数据库用来放置session是再好不过了

cookie

cookie是放在客户端的一种对用户行为的一种标记

设置redis和session-redis

在egg框架中要设置redis和session-redis才能够把session放进redis。

首先要导入模块

npm i egg-session-redis egg-redis --save

然后在config/pulgin中配置

exports.sessionRedis = {
  enable: true,
  package: 'egg-session-redis',
};

exports.redis = {
  enable: true,
  package: 'egg-redis',
};

在config/config.default.js中配置

config.redis = {
      clients: {
        session: {
          host: '127.0.0.1',
          port: '6379',
          password: '',
          db: '11',
        },
          cache: {
          host: '127.0.0.1',
          port: '6379',
          password: '',
          db: '12',
          },
      },
    };

    //这下面这个是使用那个redis数据库进行存储session
    config.sessionRedis = {
      name: 'session', //这个是选择用哪个配置进行使用redis数据库进行存储session
        };

因为预防我们在其他地方要用到redis数据库,所以就先设置两个数据库来备用。

设置session

首先先来说明设置session的各个参数

maxAge: 设置这个键值对在浏览器的最长保存时间。是一个从服务器当前时刻开始的毫秒数。
expires: 设置这个键值对的失效时间,如果设置了 maxAge,expires 将会被覆盖。如果 maxAge 和 expires 都没设置,Cookie 将会在浏览器的会话失效(一般是关闭浏览器时)的时候失效。
path: 设置键值对生效的 URL 路径,默认设置在根路径上(/),也就是当前域名下的所有 URL 都可以访问这个 Cookie。
domain: 设置键值对生效的域名,默认没有配置,可以配置成只在指定域名才能访问。
httpOnly: 设置键值对是否可以被 js 访问,默认为 true,不允许被 js 访问。
secure: 设置键值对只在 HTTPS 连接上传输,框架会帮我们判断当前是否在 HTTPS 连接上自动设置 secure 的值。
除了这些属性之外,框架另外扩展了 3 个参数的支持:

overwrite:设置 key 相同的键值对如何处理,如果设置为 true,则后设置的值会覆盖前面设置的,否则将会发送两个 set-cookie 响应头。
signed:设置是否对 Cookie 进行签名,如果设置为 true,则设置键值对的时候会同时对这个键值对的值进行签名,后面取的时候做校验,可以防止前端对这个值进行篡改。默认为 true。
encrypt:设置是否对 Cookie 进行加密,如果设置为 true,则在发送 Cookie 前会对这个键值对的值进行加密,客户端无法读取到 Cookie 的明文值。默认为 false。

但是最常用的还是 key maxAge httpOnly encrypt renew

key是session的标记,在浏览器中就可以看到这个key

maxAge 是过期时间,单位是毫秒

httpOnly 是设置来让js代码才能够获取到

encrypt session加密

renew 是用来设置,如果你刷新网页,过期时间就会重新设置

设置session

session一般都会在controller中设置,因为比较方便

this.ctx.session.userinfo = "xiaoming";
this.ctx.body = "session设置成功"

session对象是挂载到context对象上面的。

获取session
var userinfo = this.ctx.session.username
this.ctx.body = "设置的session为 " + username
删除session

在egg框架中没有可以直接把session删除的方法,只有把session设置为null

this.ctx.session.userinfo = null

设置cookie

因为session本身就是cookie的对象,所以session里面的对象,一般在cookie里面也可以使用。

this.ctx.cookies.set("username","xiaoming",{
            maxAge:1000*3600*24*7,  //这个是设置过期时间,默认是毫秒单位的
            httpOnly:true,   //表示这个cookie只能被js代码访问
            signed:true,   //设置cookie签名,不能让用户可以修改
            encrypt:true   //设置cookie加密
        })
        this.ctx.body = "cookie设置成功"

encrypt 如果设置为true的话就可以设置中文的cookie,否则就设置不了中文cookie。

获取cookie
var cookie = this.ctx.cookies.get("username",{
            httpOnly:true,   //表示这个cookie只能被js代码访问
            signed:true,   //设置cookie签名,不能让用户可以修改
            encrypt:true   //设置cookie加密,cookie加密之后就可以设置中文的cookie
        })
        this.ctx.body = "设置的cookie为" + cookie;

注意:获取cookie时,最好把设置cookie时候的参数也加上,不然就会获取不了,但是过期时间不用重新设置。

总的来说,cookie和session的设置和获取并不困难,在我遇到的后端框架中,没有哪个框架获取和设置cookie session是比较困难的,如果想要一起讨论的可以添加我的qq1693490575

你可能感兴趣的:(node.js,egg)