Node.js重新刷新session过期时间的方法


Posted in Javascript onFebruary 04, 2016

在Node.js中,我们通常使用express-session这个包来使用和管理session,保存服务端和客户端浏览器之间的会话状态。那如何才能实现当用户刷新当前页面或者点击页面上的按钮时重新刷新session的过期时间呢?类似于ASP.NET中session会话状态,只要在一定的时间内页面一直保持活动状态,session就不会过期。通过下面的代码可以实现这个功能,我们在Node.js的代码中加入下面的中间件:

// use this middleware to reset cookie expiration time
// when user hit page every time
app.use(function(req, res, next){
req.session._garbage = Date();
req.session.touch();
next();
});

这样,每次当有请求过来时,该中间件都会重新修改session的过期时间,从而达到预期的效果。

然后,在代码中加入对session的使用:

app.use(session({
secret: 'test', 
resave: false, 
saveUninitialized: true,
cookie:{
maxAge: 1000*60*60 // default session expiration is set to 1 hour
},
store: new MemcachedStore({
hosts: ['127.0.0.1:9000'],
prefix: 'test_'
})
}));

上面的session使用了memcached作为session的存储方式,有关如何使用memcached可以参考Github上的这个地址https://github.com/balor/connect-memcached

当然,你也可以使用其它的session存储方式,例如memoryStore,redis,mongoDB等等,使用方法都大同小异。

下面给大家说说Node.js session 存储的几种方法

node.js session store 有可选的四种方法的性能测试如下:

Concurrency: 1
none 4484.86 [#/sec] 
memory 2144.15 [#/sec] 
redis 1891.96 [#/sec] 
mongo 710.85 [#/sec] 
Concurrency: 10
none 5737.21 [#/sec] 
memory 3336.45 [#/sec] 
redis 3164.84 [#/sec] 
mongo 1783.65 [#/sec] 
Concurrency: 100
none 5500.41 [#/sec] 
memory 3274.33 [#/sec] 
redis 3269.49 [#/sec] 
mongo 2416.72 [#/sec] 
Concurrency: 500
none 5008.14 [#/sec] 
memory 3137.93 [#/sec] 
redis 3122.37 [#/sec] 
mongo 2258.21 [#/sec]

对比得出redis来存储在并发性越多的情况下性能优越。

The session used pages are very simple pages;

app.get("/", function(req,res){
if ( req.session && req.session.user_id){
req.session.no = req.session.user_id;
} else {
throw Error('error');
}
res.send("No: " + req.session.no);});

Redis store config:

app.use(express.session({
store: new RedisStore({
host: 'localhost',
port: 6379,
db: 2,
}),
secret: 'hello'}));

Mongo store config:

app.use(express.cookieParser());app.use(express.session({
store: new MongoStore({
url: 'mongodb://localhost/test-session'
}),
secret: 'hello'}));

在使用mongodb存储时别忘记在加载一个模块:connect-mongo

Javascript 相关文章推荐
JavaScript 模仿vbs中的 DateAdd() 函数的代码
Aug 13 Javascript
Java File类的常用方法总结
Mar 18 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
Apr 06 Javascript
JavaScript实现动画打开半透明提示层的方法
Apr 21 Javascript
JS实现随机乱撞彩色圆球特效的方法
May 05 Javascript
JavaScript引用类型之基本包装类型实例分析【Boolean、Number和String】
Aug 09 Javascript
Vue CLI3 开启gzip压缩文件的方式
Sep 30 Javascript
如何检查一个对象是否为空
Apr 11 Javascript
Vue Autocomplete 自动完成功能简单示例
May 25 Javascript
jQuery属性选择器用法实例分析
Jun 28 jQuery
javascript实现切割轮播效果
Nov 28 Javascript
vue中父子组件的参数传递和应用示例
Jan 04 Vue.js
jquery操作select元素和option的实例代码
Feb 03 #Javascript
Javascript获取统一管理的提示语(message)
Feb 03 #Javascript
javascript显示上周、上个月日期的处理方法
Feb 03 #Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
Feb 03 #Javascript
AngularJS向后端ASP.NET API控制器上传文件
Feb 03 #Javascript
javascript DIV实现跟随鼠标移动
Mar 19 #Javascript
javascript鼠标右键菜单自定义效果
Dec 08 #Javascript
You might like
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
Zend Framework教程之Zend_Form组件实现表单提交并显示错误提示的方法
2016/03/21 PHP
JavaScript 私有成员分析
2009/01/13 Javascript
JavaScript 错误处理与调试经验总结
2010/08/10 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
JQuery实现的图文自动轮播效果插件
2015/06/19 Javascript
PHP+MySQL+jQuery随意拖动层并即时保存拖动位置实例讲解
2015/10/09 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
node 使用 async 控制并发的方法
2018/05/07 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
js tab栏切换代码实例解析
2019/09/03 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
在centos7中分布式部署pyspider
2017/05/03 Python
python机器学习理论与实战(一)K近邻法
2021/01/28 Python
Django数据库连接丢失问题的解决方法
2018/12/29 Python
使用Template格式化Python字符串的方法
2019/01/22 Python
基于Python的PIL库学习详解
2019/05/10 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
Python Celery异步任务队列使用方法解析
2020/08/10 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
请解释在new与override的区别
2012/10/29 面试题
县优秀教师事迹材料
2014/01/31 职场文书
小学生元旦广播稿
2014/02/21 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
交通运输局四风问题对照检查材料思想汇报
2014/10/09 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python