详解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 相关文章推荐
使用JS操作页面表格,元素的一些技巧
Feb 02 Javascript
JQuery 学习笔记 选择器之四
Jul 23 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
Apr 18 Javascript
jquery默认校验规则整理
Mar 24 Javascript
在JavaScript中如何解决用execCommand(
Oct 19 Javascript
js实现拖拽效果(构造函数)
Dec 14 Javascript
JS随机洗牌算法之数组随机排序
Mar 23 Javascript
JavaScript中ES6 Babel正确安装过程
Jul 18 Javascript
Google 地图API资料整理及详细介绍
Aug 06 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
Oct 13 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
Aug 15 Javascript
如何通过简单的代码描述Angular父组件、子组件传值
Apr 07 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/09/10 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
ajax 缓存 问题 requestheader
2010/08/01 Javascript
Javascript实现动态菜单添加的实例代码
2013/07/05 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
jQuery检查事件是否触发的方法
2015/06/26 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
基于react组件之间的参数传递(详解)
2017/09/05 Javascript
JSON 数据格式详解
2017/09/13 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
JS实现动态生成html table表格的方法分析
2018/07/11 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
记录Django开发心得
2014/07/16 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
Python对ElasticSearch获取数据及操作
2019/04/24 Python
Python socket 套接字实现通信详解
2019/08/27 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
pygame实现五子棋游戏
2019/10/29 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
python中如何打包用户自定义模块
2020/09/23 Python
入党申请自荐书范文
2014/02/11 职场文书
淘宝店铺营销方案
2014/02/13 职场文书
关于学习的演讲稿
2014/05/10 职场文书
幼儿园课题实施方案
2014/05/14 职场文书
医德医风自我评价2015
2015/03/03 职场文书
校园安全教育心得体会
2016/01/15 职场文书
MyBatis核心源码深度剖析SQL语句执行过程
2022/05/20 Java/Android