关闭ie窗口清除Session的解决方法 |
本文标签:Session,ie 复制代码 代码如下: //function window.onunload() { alert(这就是你要做的事,关闭网页之后做的! ); location = SessionClear.aspx; } //function window.onbeforeunload() { alert(这就是你要做的事,关闭网页之前做的! ) } function window.onunload() { if ((window.screenLeft >= 10000 && window.screenTop >= 10000) || event.altKey) { </script> Handler1.ashx: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Web.SessionState; namespace WebApplication1 public void ProcessRequest(HttpContext context) public bool IsReusable 解释: 一般的会员形式的网站,在会员登陆后都会建立会话或者Cookie,然后需要在会员退出时点退出连接或按纽退出 。在会员直接关闭窗体的时候,没有触发涉及到退出的一系列退出 。而这些要等到服务器会话过期才会被清除掉 。 有幸的是在网络上终于找到可以捕获用户使用Alt+F4、标题栏按右键关闭、双击标题栏、直接按关闭按钮的事件的方法 。当然对于最小化到任务栏再进行关闭是不能捕获的 。 复制代码 代码如下: <script language="javascript"> <!-- function window.onunload(){ if((window.screenLeft>=10000 && window.screenTop>=10000)||event.altKey) { //用户非正常关闭时需要触发的动作 } } --> </script> 说明: window.screenLeft = 10000 + 边框宽 (2×2) = 10004 window.screenTop = 10000 + 工具栏高 + 标题栏高 = 10097 需要说明的,在onBeforeUnload中屏幕这些坐标属性都是正常数值 。 screenLeft:获取浏览器客户区左上角相对于屏幕左上角的 x 坐标 。 screenTop:获取浏览器客户区左上角相对于屏幕左上角的 y 坐标 。 我猜测,在窗体销毁时捕获的将产生一个特殊的数值 。在正常情况下的点击测试,数值都不会超过该数值 。 现在问题是,在onBeforeUnload中使用window.location可以正常地提交请求到指定URL,但在onUnload事件中该方法不能有效执行 。解决的方法是新开一个窗口,在将之关闭掉 。 我们可以写上这样的话,来代替以往使用的,一系列的window.location 。因为门户网站涉及到多个跨服务器的网站服务器 。在统一入口退出后,需要依次地进行顺序退出,才能达到门户网站期望的效果 。 var newWindow; 该段代码已经经过测试,在onUnload里不要使用window.close,因为对象销毁前会立即触发该事件 。而onBeforeUnload是页面将要被卸载前触发的事件 。 而所谓的清除实质上就是把做好退出功能的页面,直接以打开新窗口方式的调用 。可能在调用到关闭的时候能停顿一两秒,或者关闭窗口放在专门的退出页面 。该页面与正常退出又切回到首页,不同的是退出后会自动进行关闭,不需要再另外进行控制直接打开即可 。 [注意]在window.onUnload中如果不加判断,则会在刷新页面等导致当前页面变化都会触发该事件 。因此必须要进行判断,捕捉特定的操作,才能屏蔽掉一些正常的操作 。 续:在IE中如何在用户直接关闭窗口前清除Session 昨天曾经讲解了实现思路,但在实际操作中发现,必须要加上延迟才能确保程序可以正常执行完毕 。下面附上实现的细节,并附上简单的时间延迟函数 。代码已经经过测试 。 复制代码 代码如下: <script language="javascript"> function window.onUnload() { var newWindow; if((window.screenLeft>=10000 && window.screenTop>=10000)||event.altKey) { newWindow=window.open(‘退出程序地址,网页名称, width=0,height=0,top=4000,left=4000);//新窗口将在视区之外打开 newWindow.opener=null; sleep(5000); newWindow.close();//新窗口关闭 } } function sleep(milisecond) { var currentDate,beginDate=new Date(); var beginHour,beginMinute,beginSecond,beginMs; var hourGaps,minuteGaps,secondGaps,msGaps,gaps; beginHour=beginDate.getHours(); beginMinute=beginDate.getMinutes(); beginSecond=beginDate.getSeconds(); beginMs=beginDate.getMilliseconds(); do 二,在窗口加载或退出时,想让浏览器刷新一次可以如下操作: <script type="text/javascript" language="javascript"> window.opener.document.location.reload(); </script> <boey onload="opener.location.reload();"> 开窗时刷新 <body onUnload="opener.location.reload();">关闭时刷新 |