位置: 编程技术 - 正文

node.js中express-session配置项详解

编辑:rootadmin

推荐整理分享node.js中express-session配置项详解,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

官方地址:阅读

作用:用指定的参数创建一个session中间件,sesison数据不是保存在cookie中,仅仅sessionID保存到cookie中,session的数据仅仅保存在服务器端

警告:默认的服务器端的session存储,MemoryStore不是为了生产环境创建的,大多数情况下会内存泄露,主要用于测试和开发环境

接受的参数:

cookie:也就是session ID的cookie,默认是{ path: '/', httpOnly: true, secure: false, maxAge: null }.

genid:产生一个新的sessionID的函数,一个返回值是string类型的函数会被作为sessionID.这个函数第一个参数是req,所以如果你想要req中的参数产生sessionID还是很不错的

默认函数是使用uid-safe这个库产生id值(产生一个算法上安全的UID,可以用于cookie也可以用于URL。和rand-token和uid2相比,后者由于使用了%导致UID产生偏态,同时可能对UID产生不必要的截断。我们的uid-safe使用的是base算法,其函数uid(byteLength, callback)中第一个参数是比特长度而不是字符串长度)

源码片段:

name:在response中sessionID这个cookie的名称。也可以通过这个name读取,默认是connect.sid。如果一台机器上有多个app运行在同样的hostname+port, 那么你需要对这个sessin的cookie进行切割,所以最好的方法还是通过name设置不同的值

resave:强制session保存到session store中。即使在请求中这个session没有被修改。但是这个并不一定是必须的,如果客户端有两个并行的请求到你的客户端,一个请求对session的修改可能被另外一个请求覆盖掉,即使第二个请求并没有修改sesion。默认是true,但是默认值已经过时,因此以后default可能会被修改。因此好好研究你的需求选择一个最适用的。大多数情况下你可能需要false 最好的知道你的store是否需要设置resave的方法是通过查看你的store是否实现了touch方法(删除那些空闲的session。同时这个方法也会通知session store指定的session是活动态的),如果实现了那么你可以用resave:false,如果没有实现touch方法,同时你的store对保存的session设置了一个过期的时间,那么建议你用resave:true

我们再来看看其他的逻辑

其中经过了前面的if语句后我们的savedHash就是originalHash,我们看看这个逻辑在判断这个session是否已经保存的时候再次用到了

rolling:强制在每一个response中都发送session标识符的cookie。如果把expiration设置为一个过去的时间那么 那么过期时间设置为默认的值。roling默认是false。如果把这个值设置为true但是saveUnitialized设置为false,那么cookie不会被包含在响应中(没有初始化的session)

我们看看rolling用于了什么环境了:

很显然,如果客户端发送的sessionID和服务器的sessionID一致,如果你指定了rolling为true,那么还是会发送这个session的cookie到客户端,但是如果你设置了rolling为false,那么这时候如果同时设置了req.session.cookie.expires,而且这个req.session被修改了这时候还是会把session的cookie发送到客户端!

saveUninitialized:强制没有“初始化”的session保存到storage中,没有初始化的session指的是:刚被创建没有被修改,如果是要实现登陆的session那么最好设置为false(reducing server storage usage, or complying with laws that require permission before setting a cookie) 而且设置为false还有一个好处,当客户端没有session的情况下并行发送多个请求时。默认是true,但是不建议使用默认值。

我们来看看这个参数用于做什么判断,首先看看shouldSave方法

如果用户指明了不能保存未初始化的session,同时服务器的req.sessionID和浏览器发送过来的不一致,这时候只有在服务器的session修改的时候会保存。如果前面的前提不满足那么就需要看是否已经保存过了,如果没有保存过那么才会保存!

这个参数还被用于决定是否需要把session的cookie发送到客户端:

如果客户端和服务器端的sessionID不一致的前提下,如果用户指定了保存未初始化的session那么就需要发送,否则就只有在修改的时候才发送

secret:用于对sessionID的cookie进行签名,可以是一个string(一个secret)或者数组(多个secret)。如果指定了一个数组那么只会用 第一个元素对sessionID的cookie进行签名,其他的用于验证请求中的签名。

我们看看这个secret参数用于什么情景:

getcookie方法用于从请求中获取sessionID进行解密,作为秘钥。

用于setcookie方法,该方法用于对sessionID用指定的秘钥进行签名。

store:保存session的地方,默认是一个MemoryStore实例

我们知道这个store是用于保存session的地方,默认是一个MemoryStore,但是在生产环境下不建议使用MemoryStore,同时store有很多自定义的方法,如这里就为他添加了generate,connect,disconnect,当然也包含destroy方法。如果你对store感兴趣,可以看看下面这个通用的store具有的所有的方法:

unset:对没有设置的req.session进行控制,通过delete或者设置为null。默认是keep,destory表示当回应结束后会销毁session,keep表示session会被保存。但是在请求中对session的修改会被忽略,也不会保存

我们可以看到unset只能是默认的destroy或者keep,其用于判断是否应该销毁session,如果指定了unset方法为destrory,那么就会销毁session,也就是把req.session设置为null

在版本1.5.0后,cookie-parser这个中间件已经不是express-session工作必须的了。这个模块可以直接对req/res中的cookie进行读写,使用cookie-parser可能导致一些问题,特别是当secret在两个模块之间存在不一致的时候。

请把secure设置为true,这是明智的。但是这需要网站的支持,因为secure需要HTTPS的协议。如果设置了secure,但是你使用HTTP访问,那么cookie不会被设置,如果Node.js运行在代理上,同时使用了secure:true那么在express中需要设置”信任代理“。

如果在生产环境下需要使用安全的cookit,同时在测试环境也要能够使用。那么可以使用express中的NODE_ENV参数

cookie的secure属性可以设置为auto,那么会按照请求的方式来判断,如果是安全的就是secure。但是如果网站同时支持HTTP和HTTPS,这时候通过HTTPS设置的cookie

对于HTTP是不可见的。这在express的”trust proxy“(简化开发和生产环境)正确设置的情况下特别有用。默认下:cookie.maxAge为null

这意味着,浏览器关闭了这个cookie也就过期了。

req.session:

其中req.session是一个session对象,格式如下:

Session.regenerate():

产生一个session,调用这个方法那么一个新的SID和Session实例就会被创建,同时放置在req.session中。但是第一步是销毁指定的session

这时通用store提供的regenerate方法,但是generate方法一般要特定的库进行辅助:

这时为express-session为store指定的generate方法

session.destory():

node.js中express-session配置项详解

销毁session,同时在req.session中被移除,但是在下一次请求的时候又会被创建

session.reload():

重新装载session中的数据

session.save():

把session中的数据重新保存到store中,用内存的内容去替换掉store中的内容。这个方法在HTTP的响应后自动被调用。如果session中的数据被改变了(这个行为可以通过中间件的很多的配置来改变),正因为如此这个方法一般不用显示调用。但是在长连接的websocket中这个方法一般需要手动调用

session.touch():

更新maxAge属性,一般不需要手动调用,因为session的中间件已经替你调用了。我们看看Session是如何实现这个方法

也就是把session的maxAge设置为构造Session对象的时候的初始值。

req.session.id:

唯一的,而且不会被改变。我们看看Session的构造函数就明白了:

其中defineProperty方法如下:

其中session的id值就是req.sessionID属性而且enumerable为false,所以在控制台是打印不出来的req.session.cookie:

每一个session都有一个cookie对象,因此在每一次请求的时候你都可以改变session的cookie。如我们可以通过req.session.cookie.expires设置为false,这时候浏览器关闭cookie就不存在了

Cookie.maxAge:

req.session.cookie.maxAge返回这个cookie剩余的毫秒数,当然我们也可以通过设置expires来完成

当maxAge设置为,也就是一分钟,这时候如果已经过去了s,那么maxAge就会返回(不过要等到当前请求结束)。如果这时候我们调用req.session.touch(),那么req.session.maxAge就成了初始值了了

req.sessionID:

只读的属性。每一个session store必须是一个EventEmitter对象,同时要实现特定的方法。我们看看MemoryStore把:

也就是说MemoryStore继承了通用的Store的所有的属性和方法,如regenerate,load,createSession,当然也实现了很多自己的方法如all,clear,destroy,get,length,set,touch等

下面讨论的是一些其他的方法:

required方法表示:在这个store上一定会调用的方法

Recommended方法表示如果有这个方法那么在这个store上就会调用。Optional方法表示不会调用,但是为了给用户一个统一的store!

store.destroy(sid, callback)

必须的方法。通过sessionID来销毁session,如果session已经被销毁,那么回调函数被调用,同时传入一个error对象

store.get(sid, callback)

必须的方法。通过sessionID从store中获取session。回调函数是callback(err,session)。如果session存在那么第二个参数就是session,否则第二个参数就是null/undefined。如果error.code==="ENOENT"那么回调为callback(null,null)

store.set(sid, session, callback)

必须的方法。如果被成功设置了那么回调为callback(error)

store.touch(sid, session, callback)

推荐的方法。通过一个指定的sid和session对象去”接触“这个session.如果接触到了那么回调为callback(error)。session store用这个方法去删除那些空闲的session。同时这个方法也会通知session store指定的session是活动态的。MemoryStore实现了这个方法:

store.length(callback)

可选的方法。获取store中所有的session的个数,回调函数为callback(error,length)

store.clear(callback)

可选的方法,从store中吧所有的session都删除,回调函数为callback(err)

store.all(callback)

可选的方法。以一个数组的方法获取store中的sessions。callback(error,sessions)

从源码的角度来分析配置项:

(1)这里面的secret到底有什么用呢&#;

我们看看这个express-session到底是如何做的&#;

这里是通过cookie-signature进行的解密操作

通过这里我们很容易看到对于session ID的获取就是通过上面的secret进行签名的,如果获取到的sessionID已经被修改过,那么表示这个session已经无效了。首先是从req.headers.cookie中获取,然后从req.signedCookies中获取,最后从req.cookies中进行获取!

(2)cookie字段有什么用的&#;

我们看看cookie字段在哪里被处理了:

也就是说我们在session中传入的cookie参数也成为新创建的cookie的一个属性了,而且这个这个新创建的cookie被保存到req.session.cookie下。

标签: node.js中express-session配置项详解

本文链接地址:https://www.jiuchutong.com/biancheng/380819.html 转载请保留说明!

上一篇:NodeJs使用Mysql模块实现事务处理实例(nodejs mysql库)

下一篇:Express框架之connect-flash详解(express框架的优缺点)

  • 所得税汇算清缴招待费扣除标准
  • 单独确认进项税额的情形
  • 账面价值计税基础算法
  • 啥叫反倾销税
  • 土地增值税会计核算
  • 小规模普票冲红原票要退回吗
  • 小微企业和小规模纳税人的区别
  • 退税发票认证流程
  • 手机专票 一般纳税人能抵扣吗
  • 开广告公司需要营业执照吗
  • 小型制造型企业有哪些
  • 企业临时外出经营如何使用发票
  • 增值税返还需要交增值税吗
  • 养老保险补缴利率是多少
  • 持有至到期投资科目被取消了吗
  • 公司买车赠与员工
  • 固定资产的计税基础6种情况
  • 民办幼儿园怎么给老师交五险一金
  • 进项税额转出报税填哪个表
  • 商业折扣如何开发票
  • 种香菇会赔钱吗
  • 企业所得税季报怎么申报
  • 个体户经营所得核定税率
  • 本年利润每个月都要结转吗
  • 差旅费中的车票可以抵扣进项税吗
  • 车子计提折旧年限
  • 在win7中,当前窗口的数量是多少个
  • unsupportedfirsthd解决办法
  • 授课培训公司免责协议
  • 本月计提增值税的金额是怎么得来的
  • 收到税费返还是什么现金流量
  • intel me有什么用
  • 外贸企业退税需要哪些资料
  • vue中使用gojs
  • mom.exe是什么进程
  • 承包安装工程怎么报价
  • PHP:JDToJulian()的用法_日历函数
  • 关于出售使用过的东西
  • 一年的云信承兑汇票如何提现
  • vue中 router.beforeEach() 的用法
  • vue动态绑定背景图
  • 主营业务成本记错了怎么调整
  • 期初认证相符但未申报抵扣的进项如何消除
  • 预收账款转收入可以调以前年度吗
  • 综合所得个税计算例题
  • 织梦自定义字段
  • sql server s
  • 税是什么为什么要交税
  • 可供出售金融资产名词解释
  • 公司注销实收资本有余额怎么处理
  • 差额征收的会计分录
  • 计提生产经营所得
  • 预付账款没有收到货怎么处理
  • 生育保险基金的筹集原则是
  • 汇算清缴调增的工资怎么做账
  • 电子承兑到期怎么申请付款
  • 支付劳务费是劳务所在地吗
  • 主营业务收入是含税还是不含税
  • 什么是当期损益和其他综合收益
  • linux系统清理磁盘空间
  • WINDOWS系统中删除放入回收站的文件占用什么空间
  • win8平板触摸键盘没反应
  • vim中执行shell命令
  • linux如何设置用户自己的工作环境
  • 在JavaScript中声明变量的关键词有
  • 细说javascript
  • 天气球球下载
  • unity 2021.2
  • python enumeration
  • js设计模型
  • Python第三方库的常见安装方法有
  • 一般纳税人企业所得税怎么算
  • 运输费用抵扣税率最新规定
  • 陕西省12366纳税服务热线
  • 无锡医疗保险缴费比例
  • 深圳市电价价目表详解
  • 房产税的解读
  • 苏州市国家税务局稽查局李加云副局长
  • 杜蕾斯验证真伪扫描
  • 国家税务总局广西壮族自治区税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设