关闭ie窗口清除Session的解决方法

 本篇文章主要是对关闭ie窗口清除Session的解决方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助

 
 代码如下:
//function window.onunload() { alert('这就是你要做的事,关闭网页之后做的! '); location = 'SessionClear.aspx'; }
        //function window.onbeforeunload() { alert('这就是你要做的事,关闭网页之前做的! ') }
 
        function window.onunload() {
 
            if ((window.screenLeft >= 10000 && window.screenTop >= 10000) || event.altKey) {
                alert(window.screenLeft+","+window.screenTop);
                //用户非正常关闭时需要触发的动作
                location = 'Handler1.ashx';
            }
        } 
 
    </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
{
    /// <summary>
    /// $codebehindclassname$ 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Handler1 : IHttpHandler,IRequiresSessionState
    {
 
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Session.Abandon();
            context.Session.Clear();
        }
 
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
 
 
解释:
 
一般的会员形式的网站,在会员登陆后都会建立会话或者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; 
window.opener=null; 
newWindow=window.open(URL,PageName, 'height=0,width=0'); 
newWindow.opener=null; 
newWindow.close(); 
…… 
 
该段代码已经经过测试,在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 

currentDate=new Date(); 
hourGaps=currentDate.getHours() - beginHour; 
minuteGaps=currentDate.getMinutes() - beginMinute; 
secondGaps=currentDate.getSeconds() - beginSecond; 
msGaps=currentDate.getMilliseconds() - beginMs; 
if(hourGaps<0) hourGaps+=24; //考虑进时进分进秒的特殊情况 
gaps=hourGaps*3600+ minuteGaps*60+ secondGaps; 
gaps=gaps*1000+msGaps; 
}while(gaps<milisecond); 

</script> 
 
 
二,在窗口加载或退出时,想让浏览器刷新一次可以如下操作:
<script type="text/javascript" language="javascript">
       window.opener.document.location.reload();
</script>
<boey onload="opener.location.reload();">   开窗时刷新
<body onUnload="opener.location.reload();">关闭时刷新

时间: 2024-08-31 10:38:31

关闭ie窗口清除Session的解决方法的相关文章

关闭ie窗口清除Session的解决方法_javascript技巧

复制代码 代码如下: //function window.onunload() { alert('这就是你要做的事,关闭网页之后做的! '); location = 'SessionClear.aspx'; }        //function window.onbeforeunload() { alert('这就是你要做的事,关闭网页之前做的! ') }         function window.onunload() {             if ((window.screenLe

win7系统打开多个IE浏览器就会出现窗口重叠现象的解决方法

  win7系统打开多个IE浏览器就会出现窗口重叠现象的解决方法.win7系统下用户习惯使用IE浏览器预览一些网页,资讯,总会不自觉的打开多个窗口,忘记关闭.有时候会发现窗口出现重叠状态,看着很不舒服,而且查找某个窗口也比较麻烦,那么有什么办法能够取消窗口重叠?方法当然有的,可以从任务栏开始设置,下面小编介绍详细设置步骤,有需要的用户可参考下. 解决方法: 1.在任务栏点击鼠标右键,选择"属性"; 2.在弹出的窗口中找到:"任务栏按钮(B)"选项,将右面的菜单下拉选

Flex开发中使用Ant编译.mxml成.swf后,在.swf里使用Session的解决方法

Flex开发中使用Ant编译.mxml成.swf后,在.swf里使用Session的解决方法 http://iamin.blogdriver.com/iamin/1176113.html Flex Remote Object中直接使用HttpSession的方法在Flex Samples里有Session的操作使用例子:http://localhost:8080/samples/explorer/misc/ServerSessionDemo.mxml但是,使用mxmlc编译.mxml成.swf后

ASP.NET Web Service中使用Session 及 Session丢失解决方法 续

原文:ASP.NET Web Service中使用Session 及 Session丢失解决方法 续 1.关于Session丢失问题的说明汇总,参考这里 2.在Web Servcie中使用Session,需要对Web Method做如下处理 [WebMethod(EnableSession = true)]public void usingSession(){    Session["Name"] = "Name";}   如果不加EnableSession = t

JS弹出新窗口被拦截的解决方法_javascript技巧

在Web编程中,使用JS在新窗口打开页面的时候,会遇到被浏览器拦截的情况,那么,我们如何才能让JS打开新窗口不被浏览器阻止呢? 一.问题一 一般情况下,如果直接在js中调用window.open()函数去打开一个新窗口,浏览器会对弹出的窗口进行拦截,因为浏览器会把该窗口认为是弹出广告等用户不想得到的窗体 1.解决方法 把window.open()函数改为由用户主动点击时触发,在超链接里加入onclick事件,这样浏览器就认为是用户想访问这个页面,而不是直接弹出给用户 2.例如: <a href=

Ajax请求响应中用window.open打开新窗口被拦截的解决方法_AJAX相关

一.问题描述 ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是会被浏览器给拦截了,需要用户点下. 二.问题分析 浏览器之所以拦截新开窗口是因为该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了,即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以被拦截. 说明: 1.如果是在 <a href="javascri

Ajax请求响应中用window.open打开新窗口被拦截的解决方法

一.问题描述 ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是会被浏览器给拦截了,需要用户点下. 二.问题分析 浏览器之所以拦截新开窗口是因为该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了,即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以被拦截. 说明: 1.如果是在 <a href="javascri

实现在同一方法中获取当前方法中新赋值的session值解决方法_php技巧

项目开发中遇到这样一个问题,在同一方法中对session数组进行赋值,但是想在此方法中接着使用此session,因为我是用的if-elseif-,由于排斥作用,在if条件中给session赋值后,再调用方法进入另一个elseif条件中就获取不到上一步的赋值,现将解决方法总结如下: PHP SESSION有一个函数:session_write_close(),这个函数的作用是:写入session数据保存并且结束session. 手册中对该函数的描述中说到:Session data is usual

php中http与https跨域共享session的解决方法_php技巧

遇到了HTTP.HTTPS协议下session共享解决cookie失效的问题,这里提供一个临时解决办法. 实现原理:把session id设置到本地的cookie. 如下: 复制代码 代码如下: $currentSessionID = session_id(); session_id($currentSessionID ); 以下是实现代码,分为http与https两部分. 1,http部分: 复制代码 代码如下: <?php session_start();  $currentSessionI