Session是另一种记录客户状态的机制,不同的是 cookie 保存在客户端浏览器中,而session 保存在服务器上。
当浏览器访问服务器并发送第一次请求时,服务器端会创建一个 session 对象,生成一个类似于 key,value 的键值对, 然后将 key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带 key(cookie),找到对应的 session(value)。
Session的设置代码如下:
'use strict';
const Controller = require('egg').Controller;
class HomeController extends Controller {
async index() {
// 设置session信息
this.ctx.session.userInfo = {
name: 'Augus',
age: 18
}
// 设置session的过期时间(不建议用这样的方式,建议在config中设置)
// this.ctx.session.maxAge=5000;
await this.ctx.render('home');
}
}
module.exports = HomeController;
Session的配置和cookie基本是一样的,可以使用cookie里面的配置,配置选项在官网有非常全面的介绍,常见的配置选项如下:
// config.default.js
'use strict';
module.exports = appInfo => {
const config = exports = {};
// use for cookie sign key, should change to your own and keep security
config.keys = appInfo.name + '_1532511512428_3477';
// 配置session
config.session = {
// 设置session cookie里面的key
key: 'SESSION_ID',
// 设置最大的过期时间
maxAge: 30 * 1000 * 60,
// 设置是否只服务端可以访问
httpOnly: true,
// 设置是否加密
encrypt: true,
// 设置为true每次刷新页面的时候session都会被延期
renew: true
}
// 配置模板引擎
config.view = {
mapping: {
'.html': 'ejs',
},
};
return config;
};
Session的获取代码如下:
'use strict';
const Controller = require('egg').Controller;
class NewsController extends Controller {
async index() {
// 获取session的信息
var userInfo = this.ctx.session.userInfo;
// 将用户的信息渲染到模板文件上面
await this.ctx.render('news', {
userInfo: userInfo
});
}
}
module.exports = NewsController;
Cookie 和 Session 区别如下:
1. cookie数据存放在客户的浏览器上,session 数据放在服务器上。
2. cookie 相比 session 没有 session 安全,别人可以分析存放在本地的cookie 并进行cookie欺骗。
3. session 会在一定时间内保存在服务器上,访问增多时会比较占用服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4. 单个 cookie 保存的数据不能超过 4K ,很多浏览器都限制一个站点最多保存 20 个 cookie 。