详解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 嵌套函数指向this对象错误的解决方法
Mar 15 Javascript
仿微博字符限制效果实现代码
Apr 20 Javascript
jquery乱码与contentType属性设置问题解决方案
Jan 07 Javascript
jQuery实现的向下图文信息滚动效果
May 03 Javascript
JavaScript中数据结构与算法(四):串(BF)
Jun 19 Javascript
详解AngularJS ui-sref的简单使用
Apr 24 Javascript
微信小程序movable view移动图片和双指缩放实例代码
Aug 08 Javascript
js实现GIF图片的分解和合成
Oct 24 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
Dec 02 Vue.js
原生JS中应该禁止出现的写法
May 05 Javascript
React实现动效弹窗组件
Jun 21 Javascript
cypress测试本地web应用
Jun 01 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服务器页面间跳转实现方法
2012/08/02 PHP
php加水印的代码(支持半透明透明打水印,支持png透明背景)
2013/01/17 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
jQeury淡入淡出需要注意的问题
2010/09/08 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
函数式 JavaScript(一)简介
2014/07/07 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
jQuery实现下拉加载功能实例代码
2016/04/01 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
js倒计时显示实例
2016/12/11 Javascript
Javascript基础回顾之(二) js作用域
2017/01/31 Javascript
详解数组Array.sort()排序的方法
2020/05/09 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
详解Eslint 配置及规则说明
2018/09/10 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
PyQT实现多窗口切换
2018/04/20 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
opencv之颜色过滤只留下图片中的红色区域操作
2020/06/05 Python
python使用建议与技巧分享(二)
2020/08/17 Python
飞利浦西班牙官方网站:Philips西班牙
2020/02/17 全球购物
外企测试工程师面试题
2015/02/01 面试题
心理健康教育心得体会
2013/12/29 职场文书
2014年实验室工作总结
2014/12/03 职场文书
博士生专家推荐信
2015/03/25 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
Pytorch 中net.train 和 net.eval的使用说明
2021/05/22 Python
MySQL中varchar和char类型的区别
2021/11/17 MySQL