详解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对象的property和prototype是什么一种关系
Aug 06 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
Mar 01 Javascript
JS JSON对象转为字符串的简单实现方法
Nov 18 Javascript
jQuery实现可编辑的表格实例讲解(2)
Sep 17 Javascript
js实现文字闪烁特效的方法
Dec 17 Javascript
jQuery使用ajax跨域获取数据的简单实例
May 18 Javascript
jQuery实现两列等高并自适应高度
Dec 22 Javascript
JavaScript 事件流、事件处理程序及事件对象总结
Apr 01 Javascript
Angular directive递归实现目录树结构代码实例
May 05 Javascript
使用JavaScript保存文本文件到本地的两种方法
Jan 22 Javascript
Vue的生命周期操作示例
Sep 17 Javascript
Node快速切换版本、版本回退(降级)、版本更新(升级)
Jan 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 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
2014/06/12 PHP
php中eval函数的危害与正确禁用方法
2014/06/30 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
PHP易混淆知识整理笔记
2015/09/24 PHP
yii使用bootstrap分页样式的实例
2017/01/17 PHP
php使用Jpgraph创建3D饼形图效果示例
2017/02/15 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
2015/09/23 Javascript
jQuery+Ajax+PHP+Mysql实现分页显示数据实例讲解
2015/09/27 Javascript
如何解决ligerUI布局时Center中的Tab高度大小
2015/11/24 Javascript
jquery radio的取值_radio的选中_radio的重置方法
2016/09/20 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
layui 上传文件_批量导入数据UI的方法
2019/09/23 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
python实现给数组按片赋值的方法
2015/07/28 Python
python实现树形打印目录结构
2018/03/29 Python
基于python实现聊天室程序
2018/07/27 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
python 导入数据及作图的实现
2019/12/03 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
Python内存映射文件读写方式
2020/04/24 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
CSS Grid布局教程之浏览器开启CSS Grid Layout汇总
2014/12/30 HTML / CSS
缓刑人员的思想汇报
2014/01/11 职场文书
搞笑获奖感言
2014/01/30 职场文书
领导干部“四风”问题批评与自我批评材料
2014/09/24 职场文书
个人对照检查材料思想汇报
2014/09/26 职场文书
python 中yaml文件用法大全
2021/07/04 Python