详解Node.js开发中的express-session


Posted in Javascript onMay 19, 2017

什么是session

session是保存在服务器端的会话。session的典型应用场景是用户登录某网站之后,将其登录信息放入session,在以后的每次请求中查询相应的登录信息以确保该用户合法。比如购物车等等经典场景

为什么要使用session

谈及session一般是在web应用的背景之下,我们知道web应用是基于HTTP协议的,而HTTP协议恰恰是一种无状态协议。也就是说,用户从A页面跳转到B页面会重新发送一次HTTP请求,而服务端在返回响应的时候是无法获知该用户在请求B页面之前做了什么的。

而正是这种web动态化的需求,给HTTP协议提出了一个难题:一个无状态的协议怎样才能关联两次连续的请求呢?也就是说无状态的协议怎样才能满足有状态的需求呢?

此时有状态是必然趋势而协议的无状态性也是木已成舟,因此我们需要一些方案来解决这个矛盾,来保持HTTP连接状态,于是出现了cookie和session。

session与cookie的关系

上面提到解决HTTP协议自身无状态的方式有cookie和session。二者都能记录状态,前者是将状态数据保存在客户端,后者则保存在服务端。

安全性

cookie将信息保存在客户端,如果不进行加密的话,无疑会暴露一些隐私信息,安全性很差,一般情况下敏感信息是经过加密后存储在cookie中,但很容易就会被窃取。而session只会将信息存储在服务端,如果存储在文件或数据库中,也有被窃取的可能,只是可能性比cookie小了太多。

Session安全性方面比较突出的是存在会话劫持的问题,这是一种安全威胁,总体来讲,session的安全性要高于cookie。

express框架之session 内存存储

express-session 是基于express框专门用于处理session的中间件。session的认证机制离不开cookie,需要同时使用cookieParser 中间件。

var express = require('express');
var session = require('express-session');
var cookieParser = require('cookie-parser');

var app = express();

app.use(cookieParser());
app.use(session({
  secret: '12345',
  name: 'testapp',  //这里的name值得是cookie的name,默认cookie的name是:connect.sid
  cookie: {maxAge: 80000 }, //设置maxAge是80000ms,即80s后session和相应的cookie失效过期
  resave: false,
  saveUninitialized: true,
}));


app.get('/awesome', function(req, res){
  
  if(req.session.lastPage) {
    console.log('Last page was: ' + req.session.lastPage + ".");  
  }  
  req.session.lastPage = '/awesome'; //每一次访问时,session对象的lastPage会自动的保存或更新内存中的session中去。
  res.send("You're Awesome. And the session expired time is: " + req.session.cookie.maxAge);
});

app.get('/radical', function(req, res){
  if (req.session.lastPage) {
    console.log('Last page was: ' + req.session.lastPage + ".");  
  }
  req.session.lastPage = '/radical'; 
  res.send('What a radical visit! And the session expired time is: ' + req.session.cookie.maxAge);
});

app.get('/tubular', function(req, res){
  if (req.session.lastPage){
    console.log("Last page was: " + req.session.lastPage + ".");  
  }

  req.session.lastPage = '/tubular';
  res.send('Are you a suffer? And the session expired time is: ' + req.session.cookie.maxAge);
});


app.listen(5000);

一旦我们将express-session中间件用use挂载后,我们可以很方便的通过req参数来存储和访问session对象的数据。req.session是一个JSON格式的JavaScript对象,我们可以在使用的过程中随意的增加成员,这些成员会自动的被保存到option参数指定的地方,默认即为内存中去。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
IE6下通过a标签点击切换图片的问题
Nov 14 Javascript
利用浏览器全屏api实现js全屏
Jan 16 Javascript
jQuery中scrollLeft()方法用法实例
Jan 16 Javascript
原生js获取元素样式的简单方法
Aug 06 Javascript
JS锚点的设置与使用方法
Sep 05 Javascript
在html中引入外部js文件,并调用带参函数的方法
Oct 31 Javascript
Vue.js数据绑定之data属性
Jul 07 Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
Oct 26 Javascript
性能优化篇之Webpack构建速度优化的建议
Apr 03 Javascript
vue router导航守卫(router.beforeEach())的使用详解
Apr 19 Javascript
layui table 表格上添加日期控件的两种方法
Sep 28 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
Nov 06 Javascript
前端页面文件拖拽上传模块js代码示例
May 19 #Javascript
jQuery操作之效果详解
May 19 #jQuery
AngularJS中的promise用法分析
May 19 #Javascript
几种响应式文字详解
May 19 #Javascript
关于Bootstrap按钮组件消除黄框的方法
May 19 #Javascript
vue.js动态数据绑定学习笔记
May 19 #Javascript
Node.JS利用PhantomJs抓取网页入门教程
May 19 #Javascript
You might like
php获取目标函数执行时间示例
2014/03/04 PHP
yii添删改查实例
2015/11/16 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
JS+Canvas绘制时钟效果
2020/08/20 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
详解ES6之用let声明变量以及let loop机制
2017/07/15 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
javascript 判断用户有没有操作页面
2017/10/17 Javascript
js如何验证密码强度
2020/03/18 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
2020/06/03 Javascript
Element MessageBox弹框的具体使用
2020/07/27 Javascript
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
Python正则表达式介绍
2012/08/06 Python
python数组过滤实现方法
2015/07/27 Python
使用requests库制作Python爬虫
2018/03/25 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
简单了解django文件下载方式
2020/02/10 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
Python爬取梨视频的示例
2021/01/29 Python
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
为什么要优先使用同步代码块而不是同步方法?
2013/01/30 面试题
C#软件工程师英语面试题
2015/06/07 面试题
招商经理岗位职责
2013/11/16 职场文书
面料业务员岗位职责
2013/12/26 职场文书
关于打架的检讨书
2014/01/17 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
企业文明单位申报材料
2014/05/16 职场文书
工程部经理岗位职责
2015/02/02 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers