博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
node中如何使用session,打通session、cookie任督二脉(express框架之session实战)
阅读量:5861 次
发布时间:2019-06-19

本文共 2270 字,大约阅读时间需要 7 分钟。

1.为什么使用session?
session运行在服务器端,当客户端第一次访问服务器时,可以将客户的登录信息保存。
当客户访问其他页面时,可以判断客户的登录状态,做出提示,相当于登录拦截。
session可以和redis或者数据库等结合做持久化操作,当服务器挂掉时也不会导致某些客户信息(购物车)丢失。

2。session的工作流程:
当浏览器访问服务器并发送第一次请求时,服务器端会创建一个session对象,生成一个类似于key,value的键值对, 然后将key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带key(cookie),找到对应的session(value)。 客户的信息都保存在session中。
具体如下
创建session可以概括为三个步骤:

2.1. 生成全局唯一标识符(sessionid);

2.2. 开辟数据存储空间。一般会在内存中创建相应的数据结构,但这种情况下,系统一旦掉电,所有的会话数据就会丢失,如果是电子商务网站,这种事故会造成严重的后果。不过也可以写到文件里甚至存储在数据库中,这样虽然会增加I/O开销,但session可以实现某种程度的持久化,而且更有利于session的共享;
session持久化可以利用cookie,可以使是内存,可以redis,可以是mongoDB
2.2.1第一种就是,在比较完密码正取以后直接存到内存里面去
首先需要在项目的app.js中配置session信息,并且想要使用session需要安装两个node的插件:
安装完插件以后,配置基本信息:

secret:一个String类型的字符串,作为服务器端生成session的签名。
name:返回客户端的key的名称,默认为connect.sid,也可以自己设置。
resave:(是否允许)当客户端并行发送多个请求时,其中一个请求在另一个请求结束时对session进行修改覆盖并保存。
默认为true。但是(后续版本)有可能默认失效,所以最好手动添加。
saveUninitialized:初始化session时是否保存到存储。默认为true, 但是(后续版本)有可能默认失效,所以最好手动添加。
cookie:设置返回到前端key的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。
express-session的一些方法:
Session.destroy():删除session,当检测到客户端关闭时调用。
Session.reload():当session有修改时,刷新session。
Session.regenerate():将已有session初始化。
Session.save():保存session。
配置完session后,我们就可以在登录接口里将登录信息保存进session,这里需要根据自己的数据结构自己定义session。

最后我们取出session中的数据,渲染到我们的页面就完成了一个完整的登录过程啦!

但是上述的发做法如果服务器不小心重新启动的,session也就是失效了。因为内存已经消失了。没有保存成功
2.2.2第二种用mongo做持久化,即使网站重启也不怕,丢失
安装

3. 将session的全局唯一标示符发送给客户端。
问题的关键就在服务端如何发送这个session的唯一标识上。联系到HTTP协议,数据无非可以放到请求行、头域或Body里,基于此,一般来说会有两种常用的方式:cookie和URL重写。
3.1. Cookie
读者应该想到了,对,服务端只要设置Set-cookie头就可以将session的标识符传送到客户端,而客户端此后的每一次请求都会带上这个标识符,由于cookie可以设置失效时间,所以一般包含session信息的cookie会设置失效时间为0,即浏览器进程有效时间。至于浏览器怎么处理这个0,每个浏览器都有自己的方案,但差别都不会太大(一般体现在新建浏览器窗口的时候);
3.2. URL重写
所谓URL重写,顾名思义就是重写URL。试想,在返回用户请求的页面之前,将页面内所有的URL后面全部以get参数的方式加上session标识符(或者加在path info部分等等),这样用户在收到响应之后,无论点击哪个链接或提交表单,都会在再带上session的标识符,从而就实现了会话的保持。读者可能会觉得这种做法比较麻烦,确实是这样,但是,如果客户端禁用了cookie的话,URL重写将会是首选

如下两幅图是笔者在Firefox的Firebug插件中的截图,可以看到,当我第一次访问index.jsp时,响应头里包含了Set-cookie头,而请求头中没有。当我再次刷新页面时,图二显示在响应中不在有Set-cookie头,而在请求头中却有了Cookie头。注意一下Cookie的名字:jsessionid,顾名思义,就是session的标识符,另外可以看到两幅图中的jsessionid的值是相同的,原因笔者就不再多解释了。另外读者可能在一些网站上见过在最后附加了一段形如jsessionid=xxx的URL,这就是采用URL重写来实现的session。
(图一,首次请求index.jsp)

(图二,首次请求index.jsp)

转载于:https://juejin.im/post/5a27a867f265da432652b618

你可能感兴趣的文章
在IT界取得成功应该知道的10件事
查看>>
我的友情链接
查看>>
电子商务站点遭勒索 F5路见不平显神功
查看>>
Zabbix | 使用odbc方式监控MySQL
查看>>
MongoDB_3.2.10 集群 - 副本集
查看>>
合肥市地方税务局异地容灾系统项目<45万,RORKE,EMC,NETAPP
查看>>
TermServDevices 错误解决方案
查看>>
[总结]FFMPEG视音频编解码零基础学习方法
查看>>
oracle sqlloader 控制文件示例和cmd导入命令
查看>>
SecureCRT自动记录日志
查看>>
文档:Windows Server 2012 虚拟光纤通道(HBA)
查看>>
继续配置postfix记录
查看>>
社会化评论插件之友言
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
ssl协议工作原理
查看>>
水仙花代码
查看>>
XenDesktop 5 MCS Pool/池类型桌面重启/注销即还原
查看>>
vsftpd 配置:chroot_local_user与chroot_list_enable详解
查看>>
solidworks中 toolbox调用出现未配置的解决方法
查看>>