網路上大家都使用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中移除。
看人家寫的跟自已動手寫一遍才會發現問題呀。快動手試吧。
沒有留言:
張貼留言
留個話吧:)