ASP(Active Server Pages)技术的Session对象用于存储用户在对话期间的私有信息。以后用户的Session对象中定义的变量和对象能在页面之间同享,但是不能为应用中其余用户所访问,因此在用ASP开拓网络应用程序时,可以或许或许利用Session对象保留和跟踪用户的状况信息。

  Session对象有一个十分重要的属性:Timeout,它用于设置在会话资源被释放前,会话对象所能对峙非运动状况的光阴(默现滴20分钟)。当Timeout属性设置的光阴值耗尽后,会话资源将被释放。颠末过程Timeout属性破坏Session对象,防止了Session对象在效劳器中无穷制地发生,掩护了效劳器资源。但是,在实际网络开拓中,常常碰到因为Session对象失效,用户状况信息丢失而导致应用流程无法正常实现的成就。

  虽然利用Timeout属性释放资源的计谋是出于掩护效劳器的偏向,但是Session对象不预知的失效性,却成为开拓应用程序的一个弊病。因而在实际应用程序的开拓中,必需解决Session对象失效的成就。

  传统的解决办法

  现有的解决办法都是采纳效劳器端办法解决Session对象失效成就。典型的处理办法分为两大类:失效前的处理和失效后的处理。

  失效前的处理是指在Session对象尚未失效之前,对变量停止转存等处理,做到防患于未然。典型的解决办法是在应用程序中设定一个定时器,在Session对象失效前5分钟触发定时器,然后从新设置Session对象的各个变量和对象。因为必需在效劳器端实时掩护该定时器,而且必需包管该段程序在全体会话过程中处于激活状况,所以采纳这种办法增长了效劳器的额外负载。

  失效后的处理是指在Session对象失效后,立刻提醒用户停止处理。典型的解决办法是在Session对象失效后,在效劳器端保留断点,并提醒用户从新登录,持续实现工作。这种办法实现简略,但是往往因为断点的不行完全主动规复性,和从新登录过程的复杂性,而遭到最终用户的抱怨和指责。

  针对以上两类解决计划的缺点,笔者在编程实践中结合Cookie对象的特性,采纳Session对象与Cookie对象在客户端结合存取会话级变量的办法,既防止了对效劳器资源的额外必要,又解决了断点不行主动规复的成就,而且还免去了从新登录的麻烦。

  新的解决办法

  Cookie对象是用来存储无关以后用户数据的小信息包,它可以或许在浏览器和Web效劳器之间传递。在Web应用中,Cookie供给了一种用于跟踪、记载每个用户地位的机制。Cookie最常见的用处之一,便是保留一个Web应用中末了一次被访问的网络页面的光阴和日期或被访问的网址。

  通常,Cookie对象在客户端Windows体系目录下Cookies子目录中以文件情势存储。存储在Cookie对象中的信息数据可以或许或许被保留较长光阴,所以,可以或许或许将会话级变量备份在Cookie对象中,在Session对象失效后,颠末过程检索并利用Cookie对象中的信息来主动规复断点。

  Cookie对象具有如下几个属性:

  ●Expires:设定Cookie对象到期的日期;

  ●Domain:将Cookie对象的传送确定为仅由Domain属性确定的成员;

  ●Path:确定Cookie对象传送门路;

  ●Secure:明白Cookie对象是否平安;

  ●HasKeys:返回Cookie对象是否包含多值。

  如果没有显式定义Cookie对象的Expires属性,Cookie对象将在用户会话期结束时到期。

  ASP中颠末过程Request丛聚和Response丛聚读写对象。向Cookie对象写变量的语法如下:

  Response.Cookies(cookie)[(Key)|.attribute] = value

  此中,cookie是Cookie文件名,Key标明一个字典元素,attribute是Cookie 的一个详细性质,value是分给cookie的值。例如,为创建一个叫MyHobby的Cookie,并分派其值为:BasketBall,应用下述语法:

  <%Response.Cookies(“MyHobby")=“BasketBall" %>

  在客户机械上读取Cookie对象的办法如下:

  Request.Cookies(cookie)[(Key)|.attribute]

  此中,cookie是被请求Cookie的名字,Key是子关键字值下标,attribute是用于标明Cookie属性。例如:为抽取一个叫做MyHobby的Cookie中的信息并将它的值写到页面,应用下述语法:

  <% Request.Cookies(“MyHobby") %>

  必要注意的是:不能在HTTP页首信息已被送到请求浏览器之后,再向一个Cookie对象写入信息。换句话说,不能在任何HTML标识符被发送到浏览器之后才向浏览器发送Cookie信息。

  详细实现

  下面颠末过程一个基于ASP技术的聊天室的实现,来介绍如何处理Session对象变量失效的成就。

  ●在用户登录前初始会话级变量:UserName(用于存储登录用户名)。

  <% Session(“UserName")=“" %>

  //初始化Cookie对象

  <% Response.Cookies(“UserName")=“" %>

  ●在用户登录时,设置会话级变量并备份到客户端Cookie对象中。

  <%userName=Trim(Request.For(“UserName"))%>

  <% Session(“UserName")=userName %>

  //将会话级变量备份到客户端Cookie对象中

  <% Response.Cookies(“UserName")=userName %>

  ●在用户发言的时候,读取会话级变量,如果该变量已经失效,则颠末过程读取Cookie对象,规复该会话级变量的属性值。

  <% userName=Session(“UserName") %>

  //如果变量已经失效,则检索客户端Cookie对象

  <% if userName=“" then %>

  <% userName=Request.Cookies(“UserName") %>

  <% if userName=“" then %>

  //如果用户未颠末登录就进入聊天室,则该Cookie对象属性值为空。此时,提醒用户出错,并转向用户登录页面

  <% Response.Redirect “Error.html" %>

  <% else %>

  //从Cookie对象中规复该会话级变量

  <% Session(“UserName")=userName %>

  <% end if %>

  <% end if %>

  ●当用户退出聊天室时,清除会话级对象和Cookie对象。

  <% Session(“UserName")=“" %>

  //将Cookie对象属性值清除,防止用户不颠末登录就间接进入聊天室

  <% Response.Cookies(“UserName")=“" %>

  以上代码在Windows NT 4.0+IIS 4.0+IE 5.0环境中运行颠末过程。

  小 结

  Session对象与Cookie对象在客户端结合存取会话级变量的办法简略适用,而且可以或许有用地防止用户强行登录等成就,不失为一种较好地解决Session对象失效的客户端办法。