網路上大家都使用HttpSessionListener與HttpSessionBindingListener
二者的用法有點不一樣,但都可以達到一樣的效果。
細節的說明可以參考這篇:
這次的測試用HttpSessionBindingListener的示範:
主要是透過在設定httpsession的繫結與未繫結來監聽
public class ConcurrentUserBindingListener implements HttpSessionBindingListener{
private COSAUser currentUser;//logined user
public ConcurrentUserBindingListener(){
}
public void setUser(COSAUser currentUser){
this.currentUser = currentUser;
};
public COSAUser getUser(){
return this.currentUser;
};
@Override
public void valueBound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("sign on:" + this.currentUser.getUserName());
}
@Override
public void valueUnbound(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub
System.out.println("sign off:" + this.currentUser.getUserName());
//可能還要做一些事... } }
原本的session.setAttrtube的方法要做一些變動,改為帶入ConcurrentUserBindingListener
ConcurrentUserBindingListener concurrUserBindingListener
= new ConcurrentUserBindingListener();
concurrUserBindingListener.setUser(user);//設定登入的使用者
// create cosa session
//session.setAttribute("COSAUser", user);
session.setAttribute("COSAUser", concurrUserBindingListener);
接著在取值的時候要注意轉型的問題,否則會發生java.lang.ClassCastException,因為session裡面是存ConcurrentUserBindingListener
COSAUser user = ((COSAUser )session.getAttribute("COSAUser"));//會爆炸XD=>java.lang.ClassCastException
COSAUser user = ((ConcurrentUserBindingListener)session.getAttribute("COSAUser")).getUser();
session的銷毀的監視(valueUnbound)以下三種情況會被觸發:
- 執行 session.invalidate()時
- session逾期
- 變更 session.setAttribute("COSAUser", 其他用戶);或session.removeAttribute將listener從session中移除。
看人家寫的跟自已動手寫一遍才會發現問題呀。快動手試吧。
沒有留言:
張貼留言
留個話吧:)