1. 程式人生 > >JSP中IE直接關閉後如何去清SESSION的最終解決方案

JSP中IE直接關閉後如何去清SESSION的最終解決方案

具體做法: 第一步: 所有在開發工程中在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);
}
} </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>
然後當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 { 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");
} public void sessionDestroyed(HttpSessionEvent se) {
//destroy()事件中應該做的一些東西可以包括大家自己的一些退出時該執行的企業流程等
} //public static int getActiveSessions() {
//return activeSessions;
//}
} 為了佈署這個sessioncounter.java需要在web.xml中加入 <listener>
<listener-class>
com.ecc.util.SessionCounter
</listener-class>
</listener> 其它工程也依據些設定,可以保證IE被關閉時logout事件被正常觸發