简介

express-session是express中的一个处理session的中间件,可以说是express中最常见的中间件之一了.

由于会话管理依赖cookie的使用,所以它的api中有很多用于控制cookie的部分.

总的来说express-session有如下的特点:

  • session管理(基本功能)
  • cookie签名
  • 可替换持久储存模块

本文中使用的版本为1.15.6.

安装

npm install express-session --save

引入&使用

const express = require('express');
const app = new express();
const expressSession = require('express-session');

// 使用express-session
app.use(expressSession({
  secret:'hello world',// cookie签名 这个属性是必须的 具体配置和`cookie-parser`一样
  saveUninitialized:true, // 是否自动初始化 默认为true
  resave:false,// 当用户session无变化的时候依然自动保存
  cookie:{ // cookie的信息具体操作和`cookie-parser`一样
    maxAge:1800000// 30分钟后过期
  },
  rolling:true// 每次请求的时候覆写cookie
}))

会话简介

在express-session文档中有如下的一句说明:

Note Session data is not saved in the cookie itself, just the session ID. Session data is stored server-side.

Session中包含的数据不会保存在cookie中,仅仅是在cookie中保存了一个SessionId而已.实际的session的数据保存在服务端.

简单理解就是一个Map,键对应的是session id值保存在cookie中,值对应的是用户保存在服务端的数据.

api介绍

参数

创建express-cookie参数基本分为两种.

  • 针对于cookie的设置
  • 针对于express-session的设置

cookie设置一览:

app.use(expressSession({
  secret:'hello world', // cookie 签名必须有否则会报错
  cookie:{
    domain:<参数>,
    expires:<参数>,
    httpOnly:<参数>,
    path:<参数>,
    sameSite:<参数>,
    secure:<参数>,
    maxAge:1800000
  }
}));

而这些对应的参数就是服务端对于cookie的写入参数,至于各个参数是什么意思参考下面的文章:

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie

express-session部分设置:

app.use(expressSession({
  secret:'hello world', // cookie 签名必须有否则会报错
  genid:function (request) { // 用于替换掉默认ID生成的函数 第一个参数为reqeust
    return '随机id'
  },
  name:'connect.sid',// 每次响应中向cookie中起始的内容,默认起始为`connect.sid`,
  proxy:true,// 对于cookie使用secure后,在传递的过程中相信反向代理服务器,默认为undefined只相信正向代理
  resave:true,// 在一次会话中无论是否session被改变都会进行强制的储存
  rolling:true,// 在每次会话中的响应中都覆写一次cookie,重置倒计时
  saveUninitialized:true,// 将一个新创建还未修改的会话进行储存,默认为true
  store:object// 一个储存对象,默认使用的是`MemoryStore`这个存储器
  unset:'keep'// 控制没有设置`req.session`时候的行为(使用delete删除或者赋值null),默认'keep'会话期间不会保留,'destroy'会话完成后删除.
}));

方法

request.session上挂载的session对象,除了有你添加的内容外,还有默认的方法存在:

req.session.regenerate(function(err) {
 // 调用这个方法从新生成一个新的会话,完成后触发
})
req.session.destroy(function(err) {
 // 删除这个会话,完成后触发
})
req.session.reload(function(err) {
 // 从新加载session数据,完成后触发回调
})
req.session.save(function(err) {
 // 使用当前内存中的数据保存到储存器中
 // 默认在会话结束的时候就会自动调用这个方法
})
req.session.touch() // 更新cookie中的maxAge,一般不需要手动操作,交由中间件

属性

同样的在session实例上也有很多属性:

req.session.id // 保存唯一的会话id值,不可修改
req.session.cookie // 以键值对的形式保存cookie的原始数据
req.session.cookie.maxAge // 以毫秒的形式返回剩余存活时间
req.sessionID // 保存唯一的会话id,只读

一个简单的例子

一个简单的登录例子:

const express = require('express');
const app = new express();
const expressSession = require('express-session');
const userDb = new Map();
app.use(expressSession({
  secret:'hello world',
  saveUninitialized:true,
  resave:false,
  cookie:{
    maxAge:1800000
  },
  rolling:true,
}));


app.get('/login', (request, response) => {

  const
    id = request.query.id,
    pwd = request.query.pwd;

  if(id && pwd){

    if(userDb.has(id pwd)){

      response.send('该用户已登录');

    }else{

      request.session.userId = id pwd;
      userDb.set(id pwd,id);
      response.redirect('/');

    }

  }else{
    response.send('请输入正确的帐号和密码');
  }

});

app.get('/logout',(request, response)=>{

  const userId = request.session.userId;

  request.session.destroy((err)=>{

    if(err || !userDb.has(userId)){
      response.send('登出失败');
    }else{
      userDb.delete(userId);
      response.send('登出成功');
    }

  });

});

app.get('/',(request, response)=>{
  if(request.session.userId && userDb.has(request.session.userId)){
    response.send(`欢迎回来${userDb.get(request.session.userId)}`);
  }else{

    response.send('还未登录');
  }
});

app.use((request, response) => {
  response.send('404 not found');
});
app.listen(8888, '127.0.0.1');

在浏览器中依次输入以下url来模拟登录行为:

localhost:8888/
localhost:8888/login?id=ASCll&pwd=123456
localhost:8888/
localhost:8888/logout
localhost:8888/

暗坑

我在chrome浏览器下运行上面的例子多次后发现一个问题,浏览器会进行预读取网页来提高性能,也就是说在浏览器中当我url输入到如下的地方时:

localhost:8888/logo

根据我之间多次进入这个页面浏览器会提前访问这个页面localhost:8888/logout,而导致服务器直接删除session等到真正进入到页面的时候已经是第二次加载页面了,导致每次登出都显示失败.

希望有经验的朋友能给出一个合理的解决方案.

注意

express-sessioncookie-parser一起使用的时候对于cookie的签名必须一致.

express-session的存储实例是可以更换的,默认使用MemoryStore只适合于测试和开发使用,生产环境必须要使用其他的储存实例,否则会出现内存碎片问题,在官方文档中给出了已经实现的接口,可以对接redis以及mongodb等数据库.

该列表在官方文档的最后:

npm地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

express express-session的使用小结的更多相关文章

  1. HTML5 Web缓存和运用程序缓存(cookie,session)

    这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. iOS Swift上弃用后Twitter.sharedInstance().session()?. userName的替代方案

    解决方法如果您仍在寻找解决方案,请参阅以下内容:

  3. 使用Fabric SDK iOS访问Twitter用户时间线

    我试图在这个问题上挣扎两天.我正在使用FabricSDK和Rest工具包,试图为Twitter使用不同的RestAPIWeb服务.我可以使用具有authTokenSecret,authToken和其他值的会话对象的TWTRLogInButton成功登录.当我尝试获取用户时间线时,我总是得到失败的响应,作为:{“errors”:[{“code”:215,“message”:“BadAuthentic

  4. ios – 如何从Apple Watch调用iPhone上定义的方法

    有没有办法从Watchkit扩展中调用iPhone上的类中定义的方法?根据我的理解,目前在Watchkit和iPhone之间进行本地通信的方法之一是使用NSUserDefaults,但还有其他方法吗?

  5. ios – 如何将视频从AVAssetExportSession保存到相机胶卷?

    在此先感谢您的帮助.解决方法只需使用session.outputURL=…

  6. ios – 使用AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto拉伸捕获的照片

    解决方法所以我解决了我的问题.这是我现在使用的代码,它工作正常:…重要的输出imagaView:一些额外的信息:相机图层必须是全屏,并且outputimageView也必须是.我希望这些对某些人来说也是有用的信息.

  7. 我可以在iOS中自定义Twitter工具包的登录按钮吗?

    我已经下载了Twitter工具包框架并添加了用Twitter登录的代码.但是,我不希望登录按钮看起来像那样.我想要一个用于登录的自定义按钮.我能这样做吗?我只想使用这个框架,因为这也适用于iOS系统帐户.解决方法根据document:在按下按钮中添加代码:Objective-C的迅速

  8. ios – AVCaptureSession条形码扫描

    解决方法以下是我所拥有的项目代码示例,可以帮助您走上正确的轨道

  9. ios – 如何在Watch OS 2中引用不支持的框架

    有没有办法将框架链接到扩展名?

  10. ios7 – 在iOS 7中设置Alamofire中的自定义HTTP标头不工作

    解决方法我得到它的工作这对iOS7没有影响:然而,这将适用于iOS7和8:

随机推荐

  1. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  2. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  3. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  4. nodejs模块学习之connect解析

    这篇文章主要介绍了nodejs模块学习之connect解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. nodejs npm package.json中文文档

    这篇文章主要介绍了nodejs npm package.json中文文档,本文档中描述的很多行为都受npm-config(7)的影响,需要的朋友可以参考下

  6. 详解koa2学习中使用 async 、await、promise解决异步的问题

    这篇文章主要介绍了详解koa2学习中使用 async 、await、promise解决异步的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. Node.js编写爬虫的基本思路及抓取百度图片的实例分享

    这篇文章主要介绍了Node.js编写爬虫的基本思路及抓取百度图片的实例分享,其中作者提到了需要特别注意GBK转码的转码问题,需要的朋友可以参考下

  8. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. node.js三个步骤实现一个服务器及Express包使用

    这篇文章主要介绍了node.js三个步骤实现一个服务器及Express包使用,文章通过新建一个文件展开全文内容,具有一定的参考价值,需要的小伙伴可以参考一下

  10. node下使用UglifyJS压缩合并JS文件的方法

    下面小编就为大家分享一篇node下使用UglifyJS压缩合并JS文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

返回
顶部