详解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 相关文章推荐
关于document.cookie的使用javascript
Oct 29 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
Apr 01 Javascript
原始的js代码和jquery对比体会
Sep 10 Javascript
js将json格式内容转换成对象的方法
Nov 01 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
Apr 03 Javascript
如何用JavaScript定义一个类
Sep 12 Javascript
jQuery对JSON数据进行排序输出的方法
Jun 24 Javascript
JQ实现新浪游戏首页幻灯片
Jul 29 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
May 10 Javascript
自制微信公众号一键排版工具
Sep 22 Javascript
JS实现间歇滚动的运动效果实例
Dec 22 Javascript
js仿新浪微博消息发布功能
Feb 17 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+XML 制作简单的留言本 图文教程
2009/11/02 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
js过滤数组重复元素的方法
2010/09/05 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
JavaScript栈和队列相关操作与实现方法详解
2018/12/07 Javascript
python实现从ftp服务器下载文件的方法
2015/04/30 Python
Python中datetime模块参考手册
2017/01/13 Python
python下解压缩zip文件并删除文件的实例
2018/04/24 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
python groupby 函数 as_index详解
2019/12/16 Python
Python yield的用法实例分析
2020/03/06 Python
Django数据结果集序列化并展示实现过程
2020/04/22 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
python打开音乐文件的实例方法
2020/07/21 Python
pytorch简介
2020/11/11 Python
详解用 python-docx 创建浮动图片
2021/01/24 Python
用HTML5制作一个简单的弹力球游戏
2015/05/12 HTML / CSS
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
信息管理专业自荐书
2014/06/05 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
MySQL系列之一 MariaDB-server安装
2021/07/02 MySQL
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers
MySQL创建管理HASH分区
2022/04/13 MySQL
nginx搭建NFS网络文件系统
2022/04/14 Servers