详解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 offsetX与layerX区别
Mar 12 Javascript
JavaScript 数组运用实现代码
Apr 13 Javascript
jquery tab标签页的制作
May 10 Javascript
IE6下javasc#ipt:void(0) 无效的解决方法
Dec 23 Javascript
JS实现仿京东淘宝竖排二级导航
Dec 08 Javascript
浅谈页面装载js及性能分析方法
Dec 09 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
Aug 02 Javascript
jQuery多个版本和其他js库冲突的解决方法
Aug 11 Javascript
jquery dialog获取焦点的方法
Feb 09 Javascript
Vue 2.x教程之基础API
Mar 06 Javascript
JavaScript生成一个不重复的ID的方法示例
Sep 16 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
Jan 29 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脚本的10个技巧(5)
2006/10/09 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
php去除数组中重复数据
2014/11/18 PHP
PHP实现无限极分类图文教程
2014/11/25 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
细说javascript函数从函数的构成开始
2013/08/29 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
Javascript 赋值机制详解
2014/11/23 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
javascript实现博客园页面右下角返回顶部按钮
2015/02/22 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
详解小程序如何动态绑定点击的执行方法
2019/11/26 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
[03:45]Newbee战队出征西雅图 决战2016国际邀请赛
2016/08/02 DOTA
python动态监控日志内容的示例
2014/02/16 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
CSS3实现渐变背景兼容问题
2020/05/06 HTML / CSS
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
C#的几个面试问题
2016/05/22 面试题
工作态度检讨书
2014/02/11 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
知名企业招聘广告词大全
2014/03/18 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
白血病捐款倡议书
2014/05/14 职场文书
国家助学金受助感言
2015/08/01 职场文书
如何用python插入独创性声明
2021/03/31 Python
OpenCV实现反阈值二值化
2021/11/17 Java/Android