Java學習

          java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已經搬家了,新的地址是 http://www.javaly.cn 如果有對文章有任何疑問或者有任何不懂的地方,歡迎到www.javaly.cn (Java樂園)指出,我會盡力幫助解決。一起進步

           

          HttpSessionListener 和HttpSessionBindingListener的區別(單點登陸時有用)

          8.1. 使用HttpSessionListener

          編寫一個OnlineUserListener。

          package anni;

          import java.util.List;
          import javax.servlet.ServletContext;
          import javax.servlet.http.HttpSession;
          import javax.servlet.http.HttpSessionListener;
          import javax.servlet.http.HttpSessionEvent;

          public class OnlineUserListener implements HttpSessionListener {

          public void sessionCreated(HttpSessionEvent event) {
          }

          public void sessionDestroyed(HttpSessionEvent event) {
          HttpSession session = event.getSession();
          ServletContext application = session.getServletContext();

          // 取得登錄的用戶名
          String username = (String) session.getAttribute("username");

          // 從在線列表中刪除用戶名
          List onlineUserList = (List) application.getAttribute("onlineUserList");
          onlineUserList.remove(username);

          System.out.println(username + "超時退出。");
          }

          }

          OnlineUserListener實現了HttpSessionListener定義的兩個方法:sessionCreated()和 sessionDestroyed()。這兩個方法可以監聽到當前應用中session的創建和銷毀情況。我們這里只用到 sessionDestroyed()在session銷毀時進行操作就可以。

          從HttpSessionEvent中獲得即將銷毀的session,得到session中的用戶名,并從在線列表中刪除。最后一句向console打印一條信息,提示操作成功,這只是為了調試用,正常運行時刪除即可。

          為了讓監聽器發揮作用,我們將它添加到web.xml中:

          <listener>
          <listener-class>anni.OnlineUserListener</listener-class>
          </listener>

          以下兩種情況下就會發生sessionDestoryed(會話銷毀)事件:

          1. 執行session.invalidate()方法時。

            既然LogoutServlet.java中執行session.invalidate()時,會觸發sessionDestory()從在線用戶 列表中清除當前用戶,我們就不必在LogoutServlet.java中對在線列表進行操作了,所以LogoutServlet.java的內容現在是 這樣。

            public void doGet(HttpServletRequest request,HttpServletResponse response)
            throws ServletException, IOException {
            // 銷毀session
            request.getSession().invalidate();
            // 成功
            response.sendRedirect("index.jsp");
            }
          2. 如果用戶長時間沒有訪問服務器,超過了會話最大超時時間,服務器就會自動銷毀超時的session。

            會話超時時間可以在web.xml中進行設置,為了容易看到超時效果,我們將超時時間設置為最小值。

            <session-config>
            <session-timeout>1</session-timeout>
            </session-config>

            時間單位是一分鐘,并且只能是整數,如果是零或負數,那么會話就永遠不會超時。

          對應例子在08-01,為了驗證OnlineUserListener是否能正常執行,我們可以登錄兩個用戶,其中一個點擊注銷,另一個等待一分鐘,然后可以在console中看到輸出的信息。

          470)this.style.width=470" align=center>

          8.2. 使用HttpSessionBindingListener

          HttpSessionBindingListener雖然叫做監聽器,但使用方法與HttpSessionListener完全不同。我們實際看一下它是如何使用的。

          我們的OnlineUserBindingListener實現了HttpSessionBindingListener接口,接口中共定義了兩個方法:valueBound()和valueUnbound(),分別對應數據綁定,和取消綁定兩個事件。

          所謂對session進行數據綁定,就是調用session.setAttribute()把HttpSessionBindingListener保存進session中。我們在LoginServlet.java中進行這一步。

          // 把用戶名放入在線列表
          session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));

          這就是HttpSessionBindingListener和HttpSessionListener之間的最大區別: HttpSessionListener只需要設置到web.xml中就可以監聽整個應用中的所有session。 HttpSessionBindingListener必須實例化后放入某一個session中,才可以進行監聽。

          從監聽范圍上比較,HttpSessionListener設置一次就可以監聽所有session,HttpSessionBindingListener通常都是一對一的。

          正是這種區別成就了HttpSessionBindingListener的優勢,我們可以讓每個listener對應一個username,這樣 就不需要每次再去session中讀取username,進一步可以將所有操作在線列表的代碼都移入listener,更容易維護。

          valueBound()方法的代碼如下:

          public void valueBound(HttpSessionBindingEvent event) {
          HttpSession session = event.getSession();
          ServletContext application = session.getServletContext();

          // 把用戶名放入在線列表
          List onlineUserList = (List) application.getAttribute("onlineUserList");
          // 第一次使用前,需要初始化
          if (onlineUserList == null) {
          onlineUserList = new ArrayList();
          application.setAttribute("onlineUserList", onlineUserList);
          }
          onlineUserList.add(this.username);
          }

          username已經通過構造方法傳遞給listener,在數據綁定時,可以直接把它放入用戶列表。

          與之對應的valueUnbound()方法,代碼如下:

          public void valueUnbound(HttpSessionBindingEvent event) {
          HttpSession session = event.getSession();
          ServletContext application = session.getServletContext();

          // 從在線列表中刪除用戶名
          List onlineUserList = (List) application.getAttribute("onlineUserList");
          onlineUserList.remove(this.username);

          System.out.println(this.username + "退出。");
          }

          這里可以直接使用listener的username操作在線列表,不必再去擔心session中是否存在username。

          valueUnbound的觸發條件是以下三種情況:

          1. 執行session.invalidate()時。

          2. session超時,自動銷毀時。

          3. 執行session.setAttribute("onlineUserListener", "其他對象");或session.removeAttribute("onlineUserListener");將listener從session中刪除時。

          因此,只要不將listener從session中刪除,就可以監聽到session的銷毀。

           

          (轉載...)

          posted on 2008-10-16 12:27 找個美女做老婆 閱讀(3586) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          公告

          本blog已經搬到新家了, 新家:www.javaly.cn
           http://www.javaly.cn

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 石门县| 容城县| 宁陵县| 康乐县| 渑池县| 高要市| 行唐县| 溆浦县| 白朗县| 双江| 内黄县| 蒲江县| 南川市| 海南省| 甘孜县| 龙山县| 通化市| 和林格尔县| 寻甸| 玉树县| 喜德县| 调兵山市| 抚顺市| 怀仁县| 甘谷县| 景德镇市| 东港市| 永兴县| 安康市| 新建县| 礼泉县| 凌海市| 萍乡市| 红原县| 宽甸| 卢龙县| 永丰县| 吉安市| 松滋市| 台山市| 佛山市|