Session永久有效的实现方法

原理:在B/S系统中,如果用户在Session超时时间前与服务器进行了交互,那么将不会超时。所以我们只要模拟用户在Session超时前和服务器进行交互就可以实现Session的永久有效。

具体实现:网路上有很多中方法实现了以上原理,从而实现了Session的永久有效。我也是参考了众多方法,然后将我尝试成功的一个方法记录一下。

1. 将如下JavaScript代码放置在系统使用中一直显示的页面中,如在框架页面中,你可以将如下代码放置在Banner框架、Bottom框架、左侧一直显示的菜单框架,或者是一个隐藏框架中。如果是非框架页面,那么可以放置在不会被用户关闭的页面中,如主菜单页面。这样的目的是保证页面始终存在,从而其中的JavaScript代码可以是中在执行。

<!-- 用于从服务器上请求.aspx文件的JavaScript脚本块; -->
< script language = " javascript "  id = " KeepSessionAliveScriptBlock " >
</ script >

< script language = " javascript " >
   
// 用于循环调用服务器.aspx文件的JavaScript函数;
    keepSessionAlive();
</ script >

2. 在.js文件中添加keepSessionAlive()函数,函数体如下:

   /**
   *summary: 通过定时请求服务器的某个页面(.aspx)文件来保证Session不会超时。
 *created: liguozhu(李国珠)
   *modifty,content: [修改者,修改内容说明]
   *
   *created time: 2007-11-22
   
*/

   
function  keepSessionAlive()
   
{
        document.all[
"KeepSessionAliveScriptBlock"].src = "/BJAssess/YearAssessSubSystem/Resource/WebForm3.aspx?RandStr="+Math.random();
        
//这里的RandStr=Math.random只是为了让每次back.src的值不同,防止同一地址刷新无效的情况
        window.setTimeout("keepSessionAlive()",30000); 
   }

这里document.all["KeepSessionAliveScriptBlock"] 这里引用了页面上<script language="javascript" id="KeepSessionAliveScriptBlock"></script>的程序块对象,其中的src属性指向的是需要打开的文件。一般src 应该指向的是.js文件,这个效果就是将js文件中的内容加入到程序块中,然后再进行执行。如:src = "testJS.js", 而testJS.js文件中如果有一句window.alert("Life Is Good!");,那么执行了代码后页面会弹出"Life Is Good"的信息提示框。其实javascript程序块的src属性并不会在意引用的是否是.js文件,它仅仅是打开指定的文件,然后将文件内容按照JavaScript的方式进行执行,当然如果你打开文件的内容中不是合法的JavaScript内容,那么将不执行内容。

这里设置src的页面路径需要注意的是为了防止各个调用页面的路径不同,这里建议采用自上而下的路径方式,如例子中的路径就是BJAssess项目,然后一级级的找到需要调用的.aspx页面文件。为了放置IE读取缓存的情况,这里在读取.aspx页面文件的URL中增加一个随机数。

window.setTimeout用于定时(例子中设置的是3000毫秒,即半分钟)重复执行keepSessionAlive()一次,这里的时间可以自行设置为小于Session超时的任何时间。这个每隔半分钟的请求WebForm3.aspx页面的操作就是实现了前面“原理”中描述模拟用户操作和服务器进行交互,从而保证Session不超时的功能。

3. 在对应的路径下建立一个用于请求的.aspx页面文件,例子中是WebForm3.aspx。这里需要在HTML源码模式将所有HTML代码删除,因为如果不删除这些代码,ASP.NET在解析.aspx文件后会产生一个完整的HTML页面代码,这样如果再嵌到前面的<script language="javascript"></script>脚本块中就会由于<html>, <head>, <body>等标签出现重复而保错,在IE中显示的错误是“语法错误”。写到这里,可能会有人说既然不能产生完整的HTML页面代码,那么为什么不直接使用.ascx(用户自定义Web控件)呢?直接请求.ascx是不行的,我目前想到的原因是“你在浏览器中是无法直接请求一个.ascx文件的”,如果你在浏览器中直接请求.ascx那么浏览器会返回无法访问的错误。所以你在javascript.src = "xxx.ascx"文件的时候,实际上是请求不成功的。

到此为止实现永久Session的步骤就完成了。这里还需要特别说明一下,在网络上看到有些帖子说需要在请求的页面,如:.aspx页面中调用代码Session("xxx") = "xxx"。其中Session("xxx")是随便的一个Session值,目的是为了调用Session来保证Session不过期,实际上这个操作是没有必要的,原因是(在.NET Framework 1.1的环境下)在请求系统页面的时候,如最常见的是请求Login.aspx界面,这个时候针对此次回话的SessionID和Session就已经生成了,其他所有的Session("xxx")操作都是对于这个Session列表中具体Item的操作。所以只要你与服务器进行了交互,那么服务器就会验证你的SessionID,对应的Session是否过期,如果没有,那么就延后过期时间。

感谢我的同事李国珠提供了实现的思路和方法。:)

P.S. 如果发现Session依然超时,可能的原因是JS中请求的页面路径是否正确,因为如果引用的是无效路径,那么就不会实现和服务器交互的效果,自然也就不能满足本文开头提到的“原理”。还有如果使用了相对路径,那么请确保在IIS中启用了“父路径”(查看“父路径”是否启用的地址为: 找到你的网路应用程序,点击右键,选择“属性”,然后在“目录”选项卡中点击“配置”按钮,在弹出的窗口中的“选项”选项卡中勾选“启用父路径”。如果选择使用绝对路径则没有这个问题。) 2007-12-29 添加

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ASP.NET中,可以通过使用Session对象来实现购物车的功能。下面是一个简单的实现方法: 1. 创建一个存储商品信息的类,例如Product类,包括商品ID、名称、价格等属性。 2. 在购物车页面中,将所选的商品信息添加到Session中,可以使用如下代码: ``` List<Product> cart = Session["Cart"] as List<Product>; if (cart == null) { cart = new List<Product>(); } cart.Add(selectedProduct); Session["Cart"] = cart; ``` 这里使用了Session["Cart"]来存储购物车信息,如果Session中没有Cart对象,则创建一个新的List<Product>对象并将所选商品信息添加到其中,最后再次将cart对象存储到Session中。 3. 在购物车页面中,可以使用如下代码来获取Session中的购物车信息并展示: ``` List<Product> cart = Session["Cart"] as List<Product>; if (cart != null) { foreach (Product p in cart) { // 展示商品信息 } } ``` 这里使用了foreach循环遍历Session中的商品信息,并展示出来。 4. 如果用户要删除购物车中的某个商品,可以使用如下代码: ``` List<Product> cart = Session["Cart"] as List<Product>; if (cart != null) { cart.Remove(productToRemove); Session["Cart"] = cart; } ``` 这里使用了List的Remove方法来删除指定的商品信息,并将更新后的购物车信息重新存储到Session中。 需要注意的是,Session对象存储在服务器端,因此可能会对服务器的性能造成影响。为了减轻这种影响,可以在Session中存储较少的信息,或者使用其他存储方式,例如Cookie或数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值