Session对象失效的客户端解决方法

session|对象|解决|客户端

问题的提出
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环境中运行通过。

时间: 2024-10-14 01:50:10

Session对象失效的客户端解决方法的相关文章

Session对象失效的客户端解决方法_ASP基础

ASP(Active Server Pages)技术的Session对象用于存储用户在对话期间的私有信息.当前用户的Session对象中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问,因此在用ASP开发网络应用程序时,可以利用Session对象保存和跟踪用户的状态信息. Session对象有一个十分重要的属性:Timeout,它用于设置在会话资源被释放前,会话对象所能保持非活动状态的时间(默认值为20分钟).当Timeout属性设置的时间值耗尽后,会话资源将被释放.通过Time

关于Global.asa文件的深入研究与session变量失效提示的具体方法

一:Global.asa文件的释疑!从字面上讲!Global就是全局的,全球的意思!    我们都知道!浏览器中的变量存活期十分短暂!只有几十秒!也就是一个页面的下载时间.那么我们怎样从生命开始到结束都追踪session级变量哪?靠asp文件已经力不从心了!微软告诉我们:靠我们的Global.asa吧!    global.asa是一个可选的文件!他必须放在你的www根目录下,或是虚拟目录的根目录下.这样,可以确保你的一个应用程序共享一个global.asa文件.正是他可以在你的应用程序开始始终

js为空或不是对象问题的快速解决方法

 这篇文章主要介绍了js为空或不是对象问题的快速解决方法.需要的朋友可以过来参考下,希望对大家有所帮助 1.加了个参数<script language="javascript" defer="defer">   2. 'null'为空或不是对象:   <script type="text/javascript"> 里面加个defer=true属性试试看,   即:<script type="text/jav

jquery dialog open后,服务器端控件失效的快速解决方法

 本篇文章是对jquery dialog open后,服务器端控件失效的快速解决方法.进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 jquery dialog为我们提供了非常漂亮实用的对话框,比单调的alert.confirm.prompt好用很多.    在使用jquery与.net共同开发时,直接调用jquery dialog的open后,服务器端控件全部失效了,不能执行相应的后台代码.只是源于jquery默认把dialog添加到body中,而不是原来所在的服务器端的f

BootStrap Validator 版本差异问题导致的submitHandler失效问题的解决方法_javascript技巧

我用过的两个版本: v0.5.2-dev,0.4.5 这里针对于提交方法进行说明一下,如下代码: <script> $(function () { $("#addUserForm").bootstrapValidator({ submitHandler: function(validator, form, submitButton) { // 版本号0.4.5支持 // 版本号v0.5.2-dev不再支持submitHandler配置 } }).on("succe

asp.net运行提示未将对象引用设置到对象的实例错误解决方法_实用技巧

未将对象引用设置到对象的实例 一.网络上的一般说法 1.ViewState对象为Null. 2.DateSet空. 3.sql语句或Datebase的原因导致DataReader空. 4.声明字符串变量时未赋空值就应用变量. 5.未用new初始化对象. 6.Session对象为空. 7.对控件赋文本值时,值不存在. 8.使用Request.QueryString()时,所获取的对象不存在,或在值为空时未赋初始值. 9.使用FindControl时,控件不存在却没有做预处理. 10.重复定义造成未

探索eWebEditor在IE新版本下按钮失效问题的解决方法

硅谷网12月9日文 据<硅谷>杂志2012年第18期刊文称,eWebEditor是一个基于浏览器的在线HTML编辑器,在客户端操作的用户不需要额外去安装任何的组件,便可以在直观.可视化的图形界面下创建或发布网页内容,然而在浏览器升级到IE8甚至更高版本后,老版的eWebEditor会出现在这些浏览器下按钮失效的情况.主要探讨eWebEditor在高版本的IE或其它浏览器下按钮失效的解决方法. 0引言 eWebEditor是一个基于浏览器的在线HTML编辑器,普通用户可以通过浏览器在线生成或是编

ASP Session对象的集合以及属性方法事件

session|对象|集合 Session StaticObjects 集合StaticObjects 集合包含 Session 对象范围中用 <OBJECT> 标记创建的所有对象.该集合可用于确定对象特定属性的值,或用于遍历集合并获取所有对象的全部属性. 语法 Session.StaticObjects( Key ) 参数 Key 要检索的属性. 注释 使用循环控制结构可以遍历 StaticObjects 集合中的关键字.请看下面的示例. <% Dim objprop For Each

SQL对象名无效的解决方法

sql|解决|对象名 产生SQL对象名无效的问题大多原因是由于数据迁移导致的,下面我们给出解决方法. 在使用数据库的过程中,经常会遇到数据库迁移或者数据迁移的问题,或者有突然的数据库损坏,这时需要从数据库的备份中直接恢复.但是,此时会出现问题,这里说明几种常见问题的解决方法.一.孤立用户的问题比如,以前的数据库的很多表是用户test建立的,但是当我们恢复数据库后,test用户此时就成了孤立用户,没有与之对应的登陆用户名,哪怕你建立了一个test登录用户名,而且是以前的用户密码,用该用户登录后同样