ASP.NET之Session

  • A+
所属分类:.NET技术
摘要

试想下某个场景你和某个客服打电话沟通问题,在沟通中会涉及到专业的技术问题,客服会将电话转接给多个部门,然后分别有专门的部门为你解答问题。如果在转接的过程中客服没有记录并介绍你的情况,那么在每一次转接电话你都需要向新的沟通对象介绍你的问题和你的身份,如果转接有N次那么你就要介绍N次。


为什么使用Session

试想下某个场景你和某个客服打电话沟通问题,在沟通中会涉及到专业的技术问题,客服会将电话转接给多个部门,然后分别有专门的部门为你解答问题。如果在转接的过程中客服没有记录并介绍你的情况,那么在每一次转接电话你都需要向新的沟通对象介绍你的问题和你的身份,如果转接有N次那么你就要介绍N次。

我们在访问网页时也同样存在着这样的问题,每次向服务器发送的新请求,服务器都不会知道你上次来过(始终认为是一个新的请求),这个时候我们就需要一种信息记录机制将信息数据持久化在某个周期(会话)内保持状态。Session就是主要解决这一问题的,例如我们在多个页面访问共享的数据、在登录后访问其他页面无需再重复登录。


 什么是会话

  在生活中我们使用手机拨通电话和朋友进行沟通直到电话挂断这个过程就是一个会话,在Web开发中一个会话就是用户通过浏览器与Web服务器的一连串相关的交互过程,举例来说:例如你打算通过淘宝网购买一点衣服,当你第一次使用浏览器登录淘宝网站,然后搜索并访问购买一直到你关闭浏览器这个过程就是Web中的一个会话。


Session对象

Session对象的创建的代码非常简单在本文不进行介绍,本文主要弄清楚Seesion的原理和概念相关的内容。

Session对象是在服务端创建的,可用于存储键值对形式的数据,对象默认有效的时间是20分钟,如果20分钟后没有被访问则会自动进行销毁。

Session创建对象的依据是根据唯一标识SessionID的存在与否来觉得是否创建,如果客户端请求中包含了SessionID则说明此前已经建立了会话创建了Session对象,服务器会通过这个SessionID将对应的Session读出来,否则就会重新创建一个新的Session对象。

Session对象由于是存储在服务器的,如果存储大量数据和频繁过度使用会对服务器造成一定的压力。

 


 Session的生命周期

   一般情况下Session会话的结束是在用户关闭浏览器时结束的,实际上Session会话的结束不是因为用户关闭浏览器起的作用,本质是:存储SessionID的Cookie是一个进程内的Cookie没有设置为该Cookie的到期时间,那么关闭浏览器时会导致Cookie清除掉,从而失去SessionID最终导致Session会话结束。

下图是服务器将SeesionID对应的Cookie放到响应报文头中给浏览器:

 ASP.NET之Session


 Session依赖Cookie

  一般情况下Session的功能实现是依赖Cookie的,主要是因为Cookie为Session对象存储了SessionID。但不排除某些开发框架有自己的手段实现不依赖Cookie来实现Session的功能,例如ASP.NET平台可以通过Web.Config中进行配置来实现。

Session在浏览器和服务器之间的交互图:

ASP.NET之Session

  从流程图中可以看出不管是第一次还是非第一次Session对象的产生由始至终都离不开SessionID,并且SessionID最终是存储到Cookie中的。如果Cookie无法使用了(客户端禁用了),就会导致SessionID无法进行存储也就导致了服务器无法获取第一次访问时创建的Session对象。那么这样会导致每次请求都会创建新的Seesion对象,从而失去了Session的核心作用—状态保持。由此可以得出一个结论:Session的功能实现依赖于Cookie,没有Cookie那么Session也就失去了作用。

 

下面通过示例验证禁用Cookie后的Session是否失去了作用

示例说明:示例通过Login.aspx页面的按钮使用Session存储了数据之后跳转到Index.apsx页面,在Index.aspx页面中读取Login.aspx页面中存储的Session数据,简单来说就是一个页面传值的效果。

 

浏览器没有禁用Cookie之前:

ASP.NET之Session

 

 浏览器禁用Cookie之后:

ASP.NET之Session

分析:通过程序的实际运行情况来看,在浏览器禁用了Cookie之后导致SessionID无法进行存储从而导致服务器认为每次请求都是一次新的会话就会重新创建一新的Session,之前的Session存储的数据就会清除,最终导致Session无法实现状态的保持,无法在同一个会话中共享Session中存储的数据,再一次说明了Session依赖Cookie。