终于解决了session问题,总结!

         web应用程序的状态管理,我觉得真是比较头疼的一个问题,或许是没有去深入的了解过, 在解决的方式上走了很多的弯路。还好,问题算是基本解决了~~~

        问题描述:在该web应用程序中,各个页面需要传递一些参数,所有的参数我都是通过session进行传递(或许保存在session里面并不是件好事),同时有些页面是可以在新的窗口中打开,因此当用户离开或则关闭所有窗口的时候,session应该立即执行释放操作。但一般在所有窗口关闭的时候,会话并不会立即结束,也只有到了timeout的超时时间才自动结束,那么在当前session会话未超时之前,其中存储的参数就会浪费掉服务器上的内存资源。如果直接在关闭一个窗口的时候就进行释放操作,结果将导致在其他窗口中存储的相关参数丢失,因此产生访问错误。

        解决方式:

                1.在服务器上使用session["WindowCount"]来保存客户端的窗口数量,在session_OnStart事件中,将该植初始话为0 (session["WindowCount"] = 0 );

                2.创建两个aspx文件,分别用于客户端窗口的计数操作,分别为IncWindowCount.aspx和DecWindowCount.aspx;

                3.在IncWindowCount.aspx的page_Load事件中写入如下代码用于增加客户端窗口的数量,该文件将会在客户端的onLoad事件中载入执行,代码:

                Session["WindowCount"] = (Int)Session["WindowCount"] + 1; //客户端窗口数量加一

                4.在DecWindowCount.aspx的page_Load事件中写入如下代码用于减少客户端窗口的数量,该文件将会在客户端的onUnLoad事件中载入执行,代码:

                Session["WindowCount"] = (Int)Session["WindowCount"] - 1; //客户端窗口数量减一

                if ((Int)Session["WindowCount"]  == 0)

               {

                       Session.Abandon(); //说明客户端窗口已经全部关闭,结束当前会话

                }                

                5. 在其他页面的window.onload和onunload中加入如下语句(如果有框架,就在框架页中的window.onload和onunload中写入):

   function window_onload() {
  if ((window.name == "") || (window.name != "WindowName"))
  {
      //当window.name == ""或则window.name != "WindowName"说明客户端打开了一个新的窗口;
      //就执行服务器上的IncWindowCount.aspx文件使窗口数量加一;
      window.name = "WindowName";
      RunServerCode("IncWindowCount.aspx");
  }
}

function window_onunload() {
    if ((window.screenTop > 10000) && (window.screenLeft > 10000))
    {
        //说明当前窗口已经被关闭;
        //执行服务器上的DecWindowCount.aspx文件使窗口数量减一;
        RunServerCode("DecWindowCount.aspx");
    }
}


function RunServerCode(addr)
{
    var xmlhttp;
    try
    {
        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch(e)
    {
        try
        {
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch(e)
        {
            try
            {
                xmlhttp = new XMLHttpRequest();
            }
            catch(e)
            {
            }
        }
    }
   
   
    if (xmlhttp != null)
    {
        xmlhttp.open("GET", addr, true);
        xmlhttp.send(null);
    }
}

                6. 实际上在整个执行流程中,浏览器在第一次打开时,就会使窗口数量加一,在关闭的时候使数量减一,如果窗口数为零就结束整个会话,这样就不用等到超时的时候才结束;

                总结:该方式还存在一些问题,就是当用户直接在地址栏中输入其他网站地址的时候,是不会进行相关处理的;用于窗口计数的文件也可以合并在一个文件当中;如果能够直接取得打开当前web应用程序的窗口数,实现将会更加容易。如果有更好的方式,我会虚心接受,呵呵~~~~其它~~~~~~

                本人初学,许多知识尚未了解、其中也在网上查找了一些相关资料,因此可能有一些东西显得比较浅显。

                ----------good good study, day day up---------

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值