理解session机制
理解session机制
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。 保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。
每个客户端不论有没有登录,只要访问服务器都会产生一个session(设置了session的服务器)附带sessionId,并且会发送给客户端;
一般使用cookie发送sessionId,用户的cookie中带有sessionid;用户在访问别的页面的时候发生如下几件事情;
服务器用cookie的sessionid查找session;将session挂载到req上;这样用户去别的页面也会带有req.session;
以上的事件动作,不论用户有没有登录都会发生,设计登录网站的模式就是检验session中是否有用户信息;根据用户信息显示相应的页面;
只不过没有登录的用户,用户信息不会被保存到session中;
登录用户的信息保存在session中的动作,一般通过post方式的回调完成;
若用户登录,通过用户登录传过来的参数(req.body.name,req.body.password)查找用户信息,手动将用户信息保存到session中(
req.session.user = user),user来自于,
User.findOne({nam:ereq.body.name,password:req.body.password},function(err,user){
req.session.user = user;
//将用户的信息保存到req.session中;req.session类似一个对象,也可以叫做散列表(哈希表,对象字面量);
});
执行了以上动作之后;用户在登录其他页面,动作一次执行如下:
1、通过cookie中的sessionid查找session;并通过中间件把session挂在到req(request)上;
2、验证req.session中是否登录,并根据req.session.user其中用户显示相应信息;
关于理解“只要关闭浏览器,session就消失了”。对session来说,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。
恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。
总结:nodejs设置session,用户访问路由,用户请求req会带上session即req.session,同时服务器内存(也可以是数据库)会存储一份和这个用户相关的session;关于服务器怎么区分哪个用户的session,用的是cookie机制,cookie中存储一个唯一的sessionId;每次用户的cookie带着唯一的sessionId进来,【传递给服务器,服务器返回唯一session】
现在不明白的是在哪一步,服务器去根据sessionId去检索session并将其赋值给req,应该是在中间件中完成,具体怎么完成不太清楚;
个人猜测app.use(session({}))中是一个if判断语句,判断cookie中是否有sessionId字段,没有的话创建一个,有的话,判断有无过期,过期的话重新创建,没过期,返回session;之后将返回的session挂载到req上;
理解session机制的更多相关文章
- 深入理解session机制
原文链接https://blog.csdn.net/xihuangwutong/article/details/9819033 1. session概念 2. http协议与状态保持 3. 理解coo ...
- Tomcat源码分析 (十)----- 彻底理解 Session机制
Tomcat Session 概述 首先 HTTP 是一个无状态的协议, 这意味着每次发起的HTTP请求, 都是一个全新的请求(与上个请求没有任何联系, 服务端不会保留上个请求的任何信息), 而 Se ...
- 【转】理解cookie和session机制
cookie和session机制之间的区别与联系 具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就 ...
- 深入理解Session和Cookie机制
具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而 ...
- 正确理解cookie和session机制原理
php中cookie和session是我们常用的两个变量了,一个是用户客户端的,一个用在服务器的但他们的区别与工作原理怎么样,下面我们一起来看看cookie和session机制原理吧. cookie和 ...
- PHP中的SESSION机制
[转] php中cookie和session是我们常用的两个变量了,一个是用户客户端的,一个用在服务器的但他们的区别与工作原理怎么样,下面我们一起来看看cookie和session机制原理吧. c ...
- Session机制详解
转自:http://justsee.iteye.com/blog/1570652 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能 ...
- cookie和session机制
一.cookie和session机制之间的差别和联系 1.cookie机制 Cookie意为"甜饼",是由W3C组织提出,最早由Netscape社区发展的一种机制. 眼下Cooki ...
- cookie,Session机制的本质,跨应用程序的session共享
目录:一.术语session二.HTTP协议与状态保持三.理解cookie机制四.理解session机制五.理解javax.servlet.http.HttpSession六.HttpSession常 ...
随机推荐
- chroot
用途:更改命令的根目录. 语法:chroot Directory Command 描述: 注意:如果新根目录中的特殊文件具有与实际根目录不同的主要和次要设备号,则可能会覆盖文件系统. 只有具有 roo ...
- Java数据结构习题_算法分析
2.设T1(N)=O(f(N)),T2(N)=O(f(N)),则: T1(N)-T2(N)=o(f(N)) False,若1位2N,2为N T1(N)/T2(N)=O(1) ...
- 使用Python把Gtest XML测试结果转换为HTML格式
在最近的测试中,使用gtest测试框架对c语言代码进行测试,结果以XML文件来保存,但是测试结果的查阅和分析非常不方便.便想着把xml的结果直接转为HTML文件,方便和Jenkins系统对接显示.因现 ...
- 4x4矩阵键盘扫描
4x4矩阵键盘扫描 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架 ...
- ecshop的模板文件中如何判断用户是否登录
ecshop中对于smarty的运用和改造有很大的值得借鉴的地方,在dwt模板文件中可以直接判断用户是否登录,现在有规定,凡是只展示不销售的电商平台,一律不得展示商品价格,但可以在用户登录后显示. & ...
- Coursera-Neural Networks by Geoffrey Hinton
feed-forward networks symmetrically-connection neural networks
- Struts2五、Struts1与Struts2的区别
Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口,而struts2的Ac ...
- HashMap 的遍历key与value的方法
HashMap最经常使用的使用方法是依据key增删改查value,有时候会须要知道一个HashMap有多少个keys以及这些keys都是什么,能够用以下的代码实现. 方法1: Map map = ne ...
- Qt on Android:QTableView不显示选中虚框
在使用 QTableView 或 QTableWidget 时.有时我们不想要选中虚框,能够实现一个 ItemDelegate ,重写 drawFocus() 和 drawCheck() 两个虚函数 ...
- CodeForces 111B - Petya and Divisors 统计..想法题
找每个数的约数(暴力就够了...1~x^0.5)....看这约数的倍数最后是哪个数...若距离大于了y..统计++...然后将这个约数的最后倍数赋值为当前位置...好叼的想法题.... Program ...