摘 要: Session是维护客户与服务器间的一种会话技术。对Session对象的诞生、Session的运行机制、Session的创建与读取、Session的存储方式及Session的生命周期做了细致的分析,为用户准确认识并正确使用该对象提供参考。
关键词: 状态管理; Session技术; 会话技术;
1 、Sessoin的诞生
在Web应用程序中,客户端与服务器间是通过HTTP协议进行传输的。HTTP(超文本传输协议)是一种无状态的协议。在无状态协议下,网页工作过程如下:客户端连接到服务器;客户端通过无状态的协议HTTP向服务器端发送浏览网页的请求,告诉服务器要浏览的网页;服务器端响应用户请求,找到对应的网页并执行后,把HTML网页返回给客户端;完成客户响应后,服务器切断连接。由于没有在服务器端留下客户的任何信息,服务器会将客户忘得干干净净。
由于采用了无状态的HTTP协议,每次服务器都是重新生成新的网页,这意味着客户端在上一次请求的信息在服务器中断后全部丢失,在下一次请求时将无法访问到上一次的信息。如在网上购物过程中,用户在一个页面中将选好的商品放入购物车中;然后再到另外一个页面中选择另一件商品再放入购物车,如果没有采用状态管理技术,会发现先前选好的商品已从购物车中消失;直到用户准备去结账时,才会发现购物车是空的。再如,用户在登录页面输入了登录信息,成功登录到了服务器,但当用户继续访问服务器另外一个页面时,服务器却不知道用户的身份。
造成这一系列中断的不连续现象,是由于Web本质上是无状态的。如果要让上一次请求与本次请求联系起来,使网页间能够相互认识、相互关联,则需保存用户状态,做状态维护。状态维护即将无状态管理变成有状态管理,以保持用户信息访问的连续性。
在这种要求下,一种新的服务器端状态管理技术Sessoin对象诞生了。
2 、认识Sessoin
Sessoin用于保存用户与服务器间会话过程中所需的信息。会话过程指的是从用户开始与服务器联机,要求访问某一个特定的页面开始,到用户离开对网站的访问为此,这其间所产生的会话。这些信息将全部存储在服务器上。这样,当用户访问当前网站不同页面时,只要是在Sessoin的有效期内,Session的值就一直有效,任意页面都可以读取到Sessoin。从而页与页之间可以互相关联,相互联系,网页访问的连续性也就得到保证。
3、 Session的运行机制
Sessoin是保存特定用户会话状态的,网站页面会被成千上万的用户访问,每个用户去访问Web网站时,都会产生一个会话状态,这个会话状态是属于当前用户自己的,即不同的用户会有不同的会话状态,如果有一万个用户,就会有一万个会话状态,而且这些用户的名字都是不一样的。那么服务器又该如何区分每个会话的呢,如何知道当前会话是来自于哪个客户发出的请求呢?
为区分不同用户的会话,服务器为每个会话创建一个会话标识,即用SessoinID来标识每一个用户,将这个SessoinID号绑定到每个用户,这样服务器通过这个ID号就知道是哪个用户在访问了。毫无疑问,要正确区分每个用户,这个ID号是不能重复的,要具有唯一性。同时ASP.NET使用一种加密技术来保证这个ID号的安全性。
Sessoin运行机制也是基于这个SessoinID进行。每访问一个页面,如果使用了Sessoin技术,服务器与客户机就会通过SessoinID来标注这次会话。具体过程如下:当用户请求访问服务器上某个页面时,服务器会检查请求中是否包含会话标识SessoinID号。如果包含SessoinID号则说明服务器已为用户创建过Sessoin,只需按照SessoinID号检索Sessoin信息;如果请求中不包含SessoinID号,则服务器会为用户创建Sessoin对象,并随机生一个唯一的SessoinID,然后将生成的SessoinID通过浏览器返回到客户端以Cookie文件形式存储。
4、 SessionID的创建与读取
当用户第一次浏览服务器,向服务器发出请求Session请求时,服务器将为用户创建一个Session对象,并随机分配一个SessionID号,这个SessionID号会随着客户端浏览器以临时Cookie的形式写入客户端电脑。然后在服务器上会再生成一个sess_前缀的文件,在这个文件中保存了Session要记录的信息。
当用户下次再浏览服务器时,浏览器会将SessionID号放置在HTTP请求头部,一起传送给服务器;服务器接收到请求,根据请求的SessionID在服务器端找到对应的SessionID与之配置,以识别具体的用户;配置成功后,再从该ID号对应的sess_前缀的文件中读取出上一次记录的用户信息,然后将读取到Session信息返回给浏览器使用。
SessionID的创建与读取都是在服务器端进行,所有会话需要保存的Session信息都存储在服务器内存中,在客户端上是没有留下任何Session信息的。服务器只是向客户端留下了一个SessionID号作为下次会话的标识,客户端也仅是凭借这个标识,在下次会话时读取到想要的Session信息。这个SessionID号对用户来说是不可见的,用户只需要知道自己是处于哪个会话中即可。
5 、Session的存储方式
Session对象包括会话标识和会话信息。由前面的介绍可知,会话标识SessionID是存储在客户端的,会话信息是存储在服务器端的。
5.1、 会话标识的存储方式
默认情况下,会话标识是以Cookie的形式存放在客户端电脑上。但如果客户端禁用了Cookie,则将无法以Cookie方式存储,会话也就无法维护,甚至不能访问网站。为了解决这种情况,可以指定无Cookie的存储方式,可以用URL网址传递的方式来存储,即把会话标识附带在网址中进行传输。
要指定无Cookie的存储方式,需在网站的配置文件下指定SessionState配置节的cookieless属性为UseUrl或True,这样会话ID就会存储于URL中,在浏览器地址栏的URL中会看到附加的SessionID值。在整个会话期间,对于客户发出的每个请求,都会在每个URL中将此会话ID带上,以维持整个会话状态。这个会话ID是由IIS自动加上的,不会影响以前正常的连接。
采用无Cookie的会话方式,会话ID保存在网址中,如果用户与他人共享网址,例如:用户把网址复制给他人,而这些用户又都处于活动状态时,即所有用户共享同一个会话ID,这时可能会造成无法预料的后果,所以采用无Cookie存储会话标识时,一定要谨慎。
5.2 、会话信息的存储方式
会话信息是存储在服务器端的,在ASP.NET中,可以通过以下方式保存Session:
5.2.1、 保存到IIS服务器进程中
将会话信息保存到服务器内在中,准确地说是放在服务器IIS运行的进程中,由IIS中的inetinfo.exe进程进行管理。此方式为默认存储方式,如有需要,可设置sessionState节的mode属性为”InProc”模式来完成。
该模式的最大优点是读取速度快,性能高。缺点是当服务器关闭时,IIS进程也会关闭,这样Session的值也会随之丢失。另外由于Session存储于某一个服务器上,不能多台服务器共享。
5.2.2 、保存到ASP.NET状态服务进程中
将会话信息保存在ASP.NET状态服务进程中,状态服务进程是独立于ASP.NET辅助进程或IIS应用程序池的单独进程。此方式保存时,需在保存会话的服务器上安装有ASP.NET状态服务并将其启动,让它处于运行状态;然后设置mode属性为“StateServer”模式;再为sessionState节的stateConnection属性指定状态服务所在的服务器。
该模式的优点是由于会话不依赖IIS进程,不会随着服务器的重启而丢失Session,而且可将Session保存到其它服务器上,在多台服务器上共享Session,形成Web服务场。缺点是如果状态服务中止,也会造成Session的丢失。
5.2.3、 保存到SQL Sserver数据库中
将会话信息保存SQL Sserver数据库中。这种方式需做以下配置:将mode属性设为“SQL Server”模式;准备SQL Server数据库;指定SQL数据库连接字符串。
该模式的优点是,不会随着服务器重启而丢失Session,这是存储Session的最持久方式。缺点是速度比较慢,而且会影响服务器性能。
6 Session的生命周期
6.1、 Session何时生效
在用户第一次访问服务器上某个网页时,并不一定会创建Session对象。Session对象的生效需同时满足以下4个条件:
(1)网页是被用户第一次访问,而且从未创建过Session对象。如果网页不是被用户第一次访问,且在其他页面已创建过未过期的Session对象,服务器将不会为当前网页创建Session对象,而是找到先前创建的Session对象返回给用户;
(2)服务器端程序调用了request.getSession()或request.getSession(true)时才会创建Session对象;
(3)网页开启了会话状态。即PAGE指令的EnableSessionState设置为TRUE。如果PAGE指令的EnableSessionState属性设置为FALSE,网页将关闭会话,则服务器就不会为网页创建Session对象;
(4)在整个网站中开启了会话状态。即在配置文件Webconfig文件中SessionState配置节的mode属性没有设置为OFF。如设置为OFF,表示关闭整个网站的会话状态。默认情况下,mode属性取值为TRUE,整个网站是开启了会话的,无需单独设置。
6.2、 Session何时失效
Session是保存在服务器端的,长期使用必将耗费服务器资源。当不需要维持会话状态时,可将Session从服务器内存中清除,让其失效。以下情况中,Session对象将会失效:
6.2.1、 关闭浏览器
这种情况下,SessionID的值必须是使用了会话Cookie来保存的,否则关闭浏览器不会导致Session消失。由于SessionID是保存在会话Cookie中,会话Cookie是临时的Cookie,当浏览器关闭时,Cookie也会随着丢失,随着Cookie的消失,Session也就消失了。
如果设置的Cookie是永久的,SessionID的值是写在客户端硬盘上,则关闭浏览器后SessionID的值仍然存在,用户再次打开浏览器后,还能找到原来的Session,即Session并未消失。
6.2.2 、关闭服务器
这种情况主要是针对非持久Session,存储Session的模式为InPro模式,即Session保存在内存中。由于内存的易失性,当关闭了服务器或服务器出现了意外时,内存中的信息将全部丢失,这样Session的信息也因丢失而失效。注意,如果Session的存储模式为StateServer或SQL Server模式时,即使关闭了服务器,Session仍存在。
6.2.3 、超出Session的过期时间
当Session超出过期时间,Session便会失效,服务器会把失效的Session对象从内存中清除掉,以节省资源,提高使用性能。默认情况下,Session的过期时间为20分钟。
这里所说的过期时间是如何计算的呢,是从登录网站那刻开始计算失效时间,还是从停止对网站的一切活动那刻开始计算失效时间?注意,这里的失效时间是从Session不活动的时候开始计算,如果Session一直活动,Session就总不会过期。从该Session未被访问,开始计时一旦Session被访问,计时清0。所以默认情况下,停止活动20分钟后Session将失效。
Session默认失效时间是20分钟,也可根据实际情况,设置Session的失效时间。在ASP.NET中利用Session对象有TimeOut属性可完成会话状态超时设定。具体语法为:Session.TimeOut=数值,数值是以分钟为单位。
6.2.4、 取消了会话
ASP.NET中,当调用了Session.Abandon()方法时,将取消当前会话。因当前的会话取消而使Session失效。
7、 结语
Session不但可以维护服务器与客户端的会话状态,而且所有会话信息全部存储于服务器端,客户端只需通过会话标识即可获存取服务器上的Session,一定程度上保证了用户信息的安全性。但是,使用Session维护会话也有一定的局限性,由于信息是保存在服务器上的,当存入的信息块很大时,会造成服务器负荷的增加,从而影响服务器性能。在现实中,要针对安全性和性能做权衡处理。
参考文献
[1] 林菲. ASP.NET案例教程[M].清华大学出版社,2014.
[2]宋来. ASP.NET项目开发教程[M].西北工业大学出版社, 2018.