详解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 相关文章推荐
用Javascript数组处理多个字符串的连接问题
Aug 20 Javascript
JavaScript之自定义类型
May 04 Javascript
利用javascript打开模态对话框(示例代码)
Jan 11 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
Mar 30 Javascript
js类式继承与原型式继承详解
Apr 07 Javascript
BootStrap智能表单实战系列(七)验证的支持
Jun 13 Javascript
AngularJS模板加载用法详解
Nov 04 Javascript
JQuery通过后台获取数据遍历到前台的方法
Aug 13 jQuery
微信小程序实现左侧滑栏过程解析
Aug 26 Javascript
vue实现element表格里表头信息提示功能(推荐)
Nov 20 Javascript
js实现简单的秒表
Jan 16 Javascript
OpenLayers3实现地图显示功能
Sep 25 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
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
php项目打包方法
2008/02/18 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
php连接函数implode与分割explode的深入解析
2013/06/26 PHP
PHP数组和explode函数示例总结
2015/05/08 PHP
stripos函数知识点实例分享
2019/02/11 PHP
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
js获取当前路径的简单示例代码
2014/01/08 Javascript
浅析jquery数组删除指定元素的方法:grep()
2016/05/19 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
JavaScript修改注册表实例代码
2020/01/05 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
Python检查 云备份进程是否正常运行代码实例
2019/08/22 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
使用 css3 transform 属性来变换背景图的方法
2019/05/07 HTML / CSS
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
澳大利亚墨水站Ink Station:墨水和碳粉打印机墨盒
2019/03/24 全球购物
乌克兰排名第一的在线旅游超市:Farvater.Travel
2020/01/02 全球购物
2015元旦联欢晚会结束语
2014/12/14 职场文书
python flask框架快速入门
2021/05/14 Python
OpenCV-Python模板匹配人眼的实例
2021/06/08 Python
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL
Java异常体系非正常停止和分类
2022/06/14 Java/Android