转:http://blog.csdn.net/lifetragedy/article/details/758879
具体做法:
第一步:
所有在开发工程中在common的JSP页里的<head></head>块中写入这样一个JAVASCRIPT函数
<script language="javascript">
removeOnline(){
if(event.clientX<0&&event.clientY<0)
{
document.write('<iframe width="100" height="100" src="rs.jsp"></iframe><OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT>');
document.all.WebBrowser.ExecWB(45,1);
}
{
document.write('<iframe width="100" height="100" src="rs.jsp"></iframe><OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT>');
document.all.WebBrowser.ExecWB(45,1);
}
}
</script>
第二步:
第二步:
在html的<body></body>中写入<body onUnload="removeOnline();"></body>(此处一定要注意大小写)
解释:
一、
if(event.clientX<0&&event.clientY<0)
{
}
用于判断IE是被刷新还是被close
如果是刷新( refresh按钮)
event.clinetX与event.clientY一定是大于0的
二、
document.write('<iframe width="100" height="100" src="rs.jsp"></iframe><OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0></OBJECT>');
document.all.WebBrowser.ExecWB(45,1);
这是在IE里创建一个IE本身自带的控件,控件名为WebBrowser
此处代码的作用是
在本页创建一个IFRAME,在iframe里套一个叫rs.jsp的文件,rs.jsp文件内容如下:
<%@ page language="java" contentType="text/html; charset=gb2312"
pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Insert title here</title>
</head>
<body>
<%session.invalidate();%>
</body>
</html>
pageEncoding="gb2312"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>Insert title here</title>
</head>
<body>
<%session.invalidate();%>
</body>
</html>
然后当IFRAME加载完rs.jsp后立刻调用
document.all.WebBrowser.ExecWB(45,1);
强制IE关闭,IE关闭时通常会有一个提示框,需要用户点“YES”或“NO”,因此document.all.WebBrowser.ExecWB(45,1);这句话的作用就是强制IE关闭并且不显示该提示框而直接关闭
因此这样在IE被关闭之前session.invalidate()就被触发,session.invalidate被触发时会自动调用工程中已经有的sessioncounter.java这个类中的logout方法,于是logout事件一定是在IE被关闭前正常执行的
sesssioncounter.java内容如下:
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.log4j.Logger;
public class SessionCounter implements HttpSessionListener {
public class SessionCounter implements HttpSessionListener {
private static int activeSessions = 0;
Logger log=Logger.getLogger(SessionCounter.class.getName());
public void sessionCreated(HttpSessionEvent se) {
HttpSession session=null;
try{
session=se.getSession();
session.setMaxInactiveInterval(15*60);
log.info("session time start now");
}catch(Exception ex){
System.out.println("Session set error:"+ex);
ex.printStackTrace();
}
//System.out.println(SysDateAndTime.getSystemDateTime()+"session created");
}
Logger log=Logger.getLogger(SessionCounter.class.getName());
public void sessionCreated(HttpSessionEvent se) {
HttpSession session=null;
try{
session=se.getSession();
session.setMaxInactiveInterval(15*60);
log.info("session time start now");
}catch(Exception ex){
System.out.println("Session set error:"+ex);
ex.printStackTrace();
}
//System.out.println(SysDateAndTime.getSystemDateTime()+"session created");
}
public void sessionDestroyed(HttpSessionEvent se) {
//destroy()事件中应该做的一些东西可以包括大家自己的一些退出时该执行的企业流程等
}
//destroy()事件中应该做的一些东西可以包括大家自己的一些退出时该执行的企业流程等
}
//public static int getActiveSessions() {
//return activeSessions;
//}
}
//return activeSessions;
//}
}
为了布署这个sessioncounter.java需要在web.xml中加入
<listener>
<listener-class>
com.ecc.util.SessionCounter
</listener-class>
</listener>
<listener-class>
com.ecc.util.SessionCounter
</listener-class>
</listener>
其它工程也依据些设置,可以保证IE被关闭时logout事件被正常触发
相关推荐
标题与描述概述的知识点主要集中在Internet Explorer(IE)的Cookie机制如何引发Session丢失的问题,并探讨了解决方案。本文将深入解析这一现象的原因、影响以及如何有效应对。 ### 一、IE Cookie机制与Session关联...
针对上述问题,文档提供了一种解决方案:通过在服务器端响应中添加合适的P3P声明头。这可以通过编程方式设置,在HTTP响应头中加入如下代码: ```java //解决IE7\8跨域访问问题 response.setHeader("P3P","CP=\"IDC...
所以解决方案如下: 方法一:url中紧跟servlet/jsp文件名加;jsessionid=sessionId,其中sessionId由HttpSession.getId()得到,如http://localhost:8080/aaa/bbb.jsp;jsessionid=975FCCA6FD6058E92DDE932962A44252?...
在Web开发中,Iframe(内联框架)常用于嵌入其他网页内容,但涉及到跨域访问时,尤其是在处理Cookie和Session时,会遇到一些挑战。本文主要探讨如何解决Iframe跨域访问Cookie和Session的问题。 首先,理解跨域访问...
2. **使用服务器端处理**:另一种解决方案是改变服务器端的处理逻辑,使其能够识别无session ID的请求。例如,可以在上传接口前先检查请求头,如果没有session ID,则尝试从其他地方(如请求体或特定的参数)获取它...
在现代Web开发中,通常建议使用跨浏览器的解决方案,以确保更广泛的用户支持。 【标签】"jsp"、"博客"、"论坛"、"毕业设计"、"南京工程"揭示了项目的主题和应用场景。"jsp"表明项目的核心技术;"博客"和"论坛"则...
尽管原文提到没有找到具体的解决方案,但思路是相似的,即通过URL参数的形式传递会话标识。 3. **上传ID验证**:另一种替代方案是在服务器端生成一个唯一的上传ID,每当发起上传请求时将此ID作为参数一并发送。这种...
标题中的“IE cache缓存所带来的问题收藏”是指在开发Web应用程序时遇到的一种常见问题,即Internet Explorer(IE)浏览器的缓存机制导致的不期望的行为。这个问题主要涉及到浏览器如何处理网页内容的缓存,以及如何...
IIS是微软提供的一个全面的Web服务解决方案,适用于Windows环境;Apache是最流行的开源HTTP服务器,跨平台且支持多种编程语言;Tomcat是Apache软件基金会的一个项目,主要用于运行Java Servlet和JSP应用。 2. **Web...
- 提供了两种解决方案:Redis和Zookeeper。 - **配置**: - 需要在`configs.properties`文件中进行相应的配置。 #### BeanName生成策略 - **默认行为**:在进行包扫描时,自动为生成的BeanName移除`Impl`后缀。 -...
将FileActionForm直接作为业务层的接口入参,相当于将Web层传播到业务层中去,即将业务层绑定在特定的Web层实现技术中,按照分层模型学院派的观点,这是一种反模块化的设计,但在"一般"的业务系统并无需提供多种UI...