当前位置: 首页 > backend >正文

终于解决了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---------

 

http://www.xdnf.cn/news/11720.html

相关文章:

  • echarts如何在json地图上设置多种颜色的点位和自定义背景弹出框
  • 聊天记录2.0.db
  • 125款七夕情人节程序员专属表白网站【全网最全】HTML+CSS+JS
  • 推荐一款强大的视频播放器:恒星播放器
  • 财智V6.0(完美破解序列号特别版)
  • 中秋祝福代码,中秋快乐代码,采用H5制作的中秋动画祝福
  • 卡巴斯基病毒库离线更新教程(转)
  • 龙之崛起修改器V1.0版
  • 国产硬件防火墙横向对比
  • SQL Server 2005 dev 开发板 版本说明
  • 自己动手做博客之日志管理-5.3 管理日志列表
  • 【Vue】 第十六部分 插槽(默认插槽、具名插槽、作用域插槽)
  • GBA.js 在浏览器中的Game Boy Advance模拟器搭建指南
  • Data,computed,watch的作用?
  • 封面设计软件有什么?不容错过的五款封面设计软件
  • Android笔记之 TTS中文发音
  • 二本学渣考研失败,docker制作镜像教程
  • 仪表放大器放大倍数分析-运算放大器
  • vector的常见用法
  • 电脑黑屏问题的4种解决方法,两分钟轻松掌握
  • 计算机宽带拨号配置,宽带拨号上网怎么设置路由器
  • 关于OleDbCommand中操作数据库的几种方法的区别
  • 解决Warning: Cannot modify header information - headers already sent by问题
  • 【STM32】 DMA原理,步骤超细详解,一文看懂DMA
  • 鸿蒙生死印是谁的,逆天邪神:鸿蒙印的器灵还存在,或许云澈将知道些关于远古的秘密...
  • 蛙灵桌面
  • 完整版:iOS 6.1完美越狱全攻略(已实验成功)
  • 有哪些比较好用的黄页网站?
  • vc 网络编程(socket)
  • 备注,推荐一个别人的blog,关于界面的。