首先我在網(wǎng)上查了一下session的真正銷毀條件:
1調(diào)用 session.invalidate();方法
2 session到了設(shè)置或者默認(rèn)的超時(shí)時(shí)間,自動(dòng)銷毀(關(guān)閉瀏覽器此session還未銷毀,只是不能再用了);
明白了上面的兩條就可以去研究一下HttpSessionBindingListener這種session監(jiān)聽了。
新建一個(gè)類,繼承HttpSessionBindingListener,實(shí)現(xiàn)了兩個(gè)方法,分別是:
valueBound()和valueUnbound(),這個(gè)類按照通俗的理解就是對(duì)session綁定對(duì)象(setAttribute)過程的一種監(jiān)聽類型,它不需要配置xml文件,只是將實(shí)例化的HttpSessionBindingListener對(duì)象setAttribute到session里面就可以對(duì)HttpSessionBindingListener對(duì)象對(duì)象進(jìn)行監(jiān)聽了,其實(shí)也就是對(duì)HttpSessionBindingListener對(duì)象所對(duì)應(yīng)的session進(jìn)行監(jiān)聽,還可以記錄該session的具體信息(例如會(huì)員的登錄信息)。
valueBound是在setAttribute時(shí)觸發(fā)
valueUnbound則是在session銷毀時(shí)觸發(fā)。^-^(什么時(shí)候銷毀上文有提到)
做出這樣的一個(gè)例子:
新建一個(gè)繼承自HttpSessionBindingListener的類UsersOnlineCountListener
public class UsersOnlineCountListener implement sHttpSessionBindingListener {
int uid;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public void valueBound(HttpSessionBindingEvent arg0) {
System.out.println(uid+"登錄了"+new Date());
}
public void valueUnbound(HttpSessionBindingEvent arg0) {
System.out.println(uid+"下線了"+new Date());
}
}
會(huì)員登錄成功的時(shí)候,代碼中加上:
UsersOnlineCountListener uocl = newUsersOnlineCountListener();
uocl.setUid(obj.getUid());
session.setAttribute("uocl", uocl);//這個(gè)時(shí)候要觸發(fā)valueBound方法了
控制臺(tái)輸出:
11登錄了Mon Sep 20 02:09:37 CST 2010
點(diǎn)擊注銷的時(shí)候,session銷毀,觸發(fā)valueUnbound
控制臺(tái)輸出:
11下線了Mon Sep 20 02:10:22 CST 2010
如果直接關(guān)閉瀏覽器,控制臺(tái)不會(huì)立刻輸出"11下線了Mon Sep 20 02:40:13 CST 2010"
大約30分鐘后(session的自動(dòng)銷毀時(shí)間,可以設(shè)定)
控制臺(tái)輸出:
11下線了Mon Sep 20 02:40:13 CST 2010
這里總結(jié)下:valueUnbound方法將被以下任一條件觸發(fā)
a. 執(zhí)行session.setAttribute("uocl", 非uocl對(duì)象)時(shí)。
b. 執(zhí)行session.removeAttribute("uocl") 時(shí)。
c. 執(zhí)行session.invalidate()時(shí)。
d. session超時(shí)后。
愛華網(wǎng)


