简介
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"color: #ff0000">暗坑
我在chrome浏览器下运行上面的例子多次后发现一个问题,浏览器会进行预读取网页来提高性能,也就是说在浏览器中当我url输入到如下的地方时:
localhost:8888/logo根据我之间多次进入这个页面浏览器会提前访问这个页面
localhost:8888/logout
,而导致服务器直接删除session
等到真正进入到页面的时候已经是第二次加载页面了,导致每次登出都显示失败.希望有经验的朋友能给出一个合理的解决方案.
注意
当
express-session
和cookie-parser
一起使用的时候对于cookie
的签名必须一致.
express-session
的存储实例是可以更换的,默认使用MemoryStore
只适合于测试和开发使用,生产环境必须要使用其他的储存实例,否则会出现内存碎片问题,在官方文档中给出了已经实现的接口,可以对接redis
以及mongodb
等数据库.该列表在官方文档的最后:
npm地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]