Session
Node.js本身并没有提供Session的功能,但一般网站都有用户登录的功能,为了方便开发者使用,thinkjs提供一套session的机制。
Session都需要依赖浏览器端的一个Cookie来实现,然后把这个Cookie值作为key到对应的地方去查询,如果有相应的数值表示已经登录,否则表示没有登录。
配置
Session有如下的配置:
//Session配置session_name: "thinkjs", //session对应的cookie名称session_type: "File", //session存储类型, 空为内存,还可以为Dbsession_path: "", //File类型下文件存储位置,默认为系统的tmp目录session_options: {}, //session对应的cookie选项session_sign: "", //session对应的cookie使用签名,如果使用签名,这里填对应的签名字符串session_timeout: 24 * 3600, //session失效时间,单位:秒
默认的Session的存储方式是File类型,可以修改为内存或者Db的方式,对应的值为""和Db。
如果使用cluster模式,则不能使用内存的方式。
使用Db(Mysql)来存储Session需要建如下的数据表:
DROP TABLE IF EXISTS `think_session`;CREATE TABLE `think_session` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`key` varchar(255) NOT NULL DEFAULT '',`data` text,`expire` bigint(11) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `cookie` (`key`),KEY `expire` (`expire`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
将数据表名think_session改为项目里对应的前缀+session。
使用Session
在Controller里,可以通过下面的方式使用Session:
//使用Session////获取session里userInfo的值this.session("userInfo").then(function(data){})//设置Sessionthis.session("userInfo", {name: "welefen", "email": "welefen@gmail.com"}).then(function(){})//删除Sessionthis.session().then(function(){});
Session的读、写、删除操作都是异步的。
过期Session清除策略
一个用户登录后如果长期不再登录,那么这个Session对应的缓存数据就可以删除了。如果不删除那么会导致数据量越来越大,影响性能。
thinkjs提供了一套定时删除过期Session的策略,由于Session类继承自Cache,所以Session和Cache的清除策略是一样的。 可以通过如下的参数来清除:
//过期数据清除策略cache_gc_hour: [4], //缓存清除的时间点,数据为小时。
这里表示在凌晨4点的时候进行一次清除,你可以修改多个时间点进行清除。如:早上3点、早上9点、下午5点、晚上10点,那么配置值为 [3, 9, 17, 22]。
示例
判断用户是否登录:
//判断用户是否登录var self = this;return this.session("userInfo").then(function(data){if(isEmpty(data)){//未登录情况跳转到登录页return self.redirect("/login")}else{self.userInfo = data;//将用户信息赋值到模版变量里,供模版里使用self.assign("userInfo", data);}})
用户登录成功写入Session:
//用户登录成功写入Sessionvar name = this.post("name"); //获取post过来的用户名var pwd = this.post("pwd"); //获取post过来的密码var self = this;return D('User').where({ //根据用户名和密码查询符合条件的数据name: name,pwd: md5(pwd)}).find().then(function(data){if(isEmpty(data)){//用户名或者密码不正确,返回错误信息return self.error(403, "用户名或者密码不正确");}else{return self.session("userInfo", data);}}).then(function(){//返回正确信息return self.success();})
