星期三, 6月 26, 2013

[Java] 計算Concurrent User

客戶希望能看到網站目前的在線人數有哪些,
網路上大家都使用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)以下三種情況會被觸發:

  1. 執行 session.invalidate()時
  2. session逾期 
  3. 變更 session.setAttribute("COSAUser", 其他用戶);或session.removeAttribute將listener從session中移除。 

看人家寫的跟自已動手寫一遍才會發現問題呀。快動手試吧。

沒有留言:

張貼留言

留個話吧:)