详解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/jquery解析json和数组格式的方法详解
Jan 09 Javascript
js delete 用法(删除对象属性及变量)
Aug 24 Javascript
JS实现屏蔽shift,Ctrl,alt等功能键的方法
Jun 01 Javascript
JavaScript实现的选择排序算法实例分析
Apr 14 Javascript
微信小程序商城项目之商品属性分类(4)
Apr 17 Javascript
vue.js 添加 fastclick的支持方法
Aug 28 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
May 08 Javascript
Vue.js路由实现选项卡简单实例
Jul 24 Javascript
JS删除数组指定值常用方法详解
Jun 04 Javascript
微信小程序地图实现展示线路
Jul 29 Javascript
three.js欧拉角和四元数的使用方法
Jul 26 Javascript
vue内置组件keep-alive事件动态缓存实例
Oct 30 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 pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
php实例分享之二维数组排序
2014/05/15 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
Javascript面向对象编程
2012/03/18 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
JS操作Cookie写入和读取实例代码
2013/10/20 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
一不小心就做错的JS闭包面试题
2015/11/25 Javascript
JavaScript和jQuery获取input框的绝对位置实现方法
2016/10/13 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
Python标准库sched模块使用指南
2017/07/06 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
Python创建数字列表的示例
2019/11/28 Python
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
请介绍一下WSDL的文档结构
2013/03/17 面试题
研究生求职推荐信范文
2013/11/30 职场文书
学期自我评价
2014/01/27 职场文书
授权委托书(完整版)
2014/09/10 职场文书
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis