node中如何使用session,打通session、cookie任督二脉(express框架之session实战)

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)
相关文章
相关标签/搜索