摘要:简介是中的一个处理的中间件可以说是中最常见的中间件之一了由于会话管理依赖的使用所以它的中有很多用于控制的部分总的来说有如下的特点管理基本功能签名可替换持久储存模块本文中使用的版本为安装引入使用使用签名这个属性是必须的具体配置和
简介
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...
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-session和cookie-parser一起使用的时候对于cookie的签名必须一致.
express-session的存储实例是可以更换的,默认使用MemoryStore只适合于测试和开发使用,生产环境必须要使用其他的储存实例,否则会出现内存碎片问题,在官方文档中给出了已经实现的接口,可以对接redis以及mongodb等数据库.
该列表在官方文档的最后:
npm地址
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/99914.html
摘要:简介在我的前一篇小文中小书提到了可以更换会话储存那么这篇文章我们就来讲讲在进行会话管理的时候如何将会话数据保存在外部数据库中本文中我们使用用作会话储存数据库本文中使用的模块以及版本号一览模块名称版本号特性支持支持所有版本的支持支持 简介 在我的前一篇小文中express-session小书提到了express-session可以更换会话储存. 那么这篇文章我们就来讲讲express在进...
摘要:简介在我的前一篇小文中小书提到了可以更换会话储存那么这篇文章我们就来讲讲在进行会话管理的时候如何将会话数据保存在外部数据库中本文中我们使用用作会话储存数据库本文中使用的模块以及版本号一览模块名称版本号特性支持支持所有版本的支持支持 简介 在我的前一篇小文中express-session小书提到了express-session可以更换会话储存. 那么这篇文章我们就来讲讲express在进...
摘要:通过浏览器的,可以看到此次会话的请求内容和响应内容。是协议的一部分。真实的产品,一般是创建一个保证唯一的,不易猜测出来的字符串。因此需要数据持久化的多提供者的方案。 使用过几种Web App开发语言和框架,都会接触到Session的概念。即使是一个简单站点访问计数的功能,也常常使用Session来实现的。其他常用的领域还有购物车,登录用户等。但是,对Session一直是一知半解,知其然...
摘要:默认链接错误其他中间件省略默认小时全局中间件第一次登陆从数据库中比对账号验证是否成功,如成功保存用户信息登陆成功需要登陆验证的路由获取文章你好,欢迎来到我的家园。你还没有登录,先登录下再试试个人项目小博客链接参考文章 redis.js var ioRedis = require(ioredis); var logger = require(./logger); var redis = ...
摘要:为用户提供授权以允许用户操作非公开资源,有很多种方式。具体的代码根据不同的授权方案而有所不同。使用授权原理利用来验证用户,有两种机制实现。使用来实现用户授权主要用于签发如果有将异步的签名。 在很多应用中,我们都需要向服务端提供自己的身份凭证来获得访问一些非公开资源的授权。比如在一个博客平台,我们要修改自己的博客,那么服务端要求我们能够证明 我是我 ,才会允许我们修改自己的...
阅读 1519·2021-11-18 10:02
阅读 1657·2021-09-04 16:40
阅读 3172·2021-09-01 10:48
阅读 875·2019-08-30 15:55
阅读 1853·2019-08-30 15:55
阅读 1368·2019-08-30 13:05
阅读 3013·2019-08-30 12:52
阅读 1626·2019-08-30 11:24