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---------