在我前几篇博客当中有说明了一下express框架当中的session,这篇就来讲解一下egg中的cookie和session。
session本来也算是cookie的一种,但是session时存储在服务器上面的,一般都是放在redis数据库中,这种内存型数据库用来放置session是再好不过了
cookie是放在客户端的一种对用户行为的一种标记
在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的各个参数
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一般都会在controller中设置,因为比较方便
this.ctx.session.userinfo = "xiaoming";
this.ctx.body = "session设置成功"
session对象是挂载到context对象上面的。
var userinfo = this.ctx.session.username
this.ctx.body = "设置的session为 " + username
在egg框架中没有可以直接把session删除的方法,只有把session设置为null
this.ctx.session.userinfo = null
因为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。
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时候的参数也加上,不然就会获取不了,但是过期时间不用重新设置。