<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java學(xué)習(xí)

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

     

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

    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實現(xiàn)了HttpSessionListener定義的兩個方法:sessionCreated()和 sessionDestroyed()。這兩個方法可以監(jiān)聽到當(dāng)前應(yīng)用中session的創(chuàng)建和銷毀情況。我們這里只用到 sessionDestroyed()在session銷毀時進(jìn)行操作就可以。

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

    為了讓監(jiān)聽器發(fā)揮作用,我們將它添加到web.xml中:

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

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

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

      既然LogoutServlet.java中執(zhí)行session.invalidate()時,會觸發(fā)sessionDestory()從在線用戶 列表中清除當(dāng)前用戶,我們就不必在LogoutServlet.java中對在線列表進(jìn)行操作了,所以LogoutServlet.java的內(nèi)容現(xiàn)在是 這樣。

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

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

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

      時間單位是一分鐘,并且只能是整數(shù),如果是零或負(fù)數(shù),那么會話就永遠(yuǎn)不會超時。

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

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

    8.2. 使用HttpSessionBindingListener

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

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

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

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

    這就是HttpSessionBindingListener和HttpSessionListener之間的最大區(qū)別: HttpSessionListener只需要設(shè)置到web.xml中就可以監(jiān)聽整個應(yīng)用中的所有session。 HttpSessionBindingListener必須實例化后放入某一個session中,才可以進(jìn)行監(jiān)聽。

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

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

    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已經(jīng)通過構(gòu)造方法傳遞給listener,在數(shù)據(jù)綁定時,可以直接把它放入用戶列表。

    與之對應(yīng)的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操作在線列表,不必再去擔(dān)心session中是否存在username。

    valueUnbound的觸發(fā)條件是以下三種情況:

    1. 執(zhí)行session.invalidate()時。

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

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

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

     

    (轉(zhuǎn)載...)

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


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


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計

    公告

    本blog已經(jīng)搬到新家了, 新家:www.javaly.cn
     http://www.javaly.cn

    常用鏈接

    留言簿(6)

    隨筆檔案

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 老司机在线免费视频| 最近新韩国日本免费观看| 韩国欧洲一级毛片免费| 亚洲精品第一国产综合野| AV免费网址在线观看| 亚洲美女视频网站| 亚洲免费人成视频观看| 免费国产成人高清在线观看网站| 亚洲欧洲日产韩国在线| 美女网站免费福利视频| 亚洲综合色丁香婷婷六月图片| 啦啦啦中文在线观看电视剧免费版 | 最近免费mv在线观看动漫| 国产亚洲综合一区柠檬导航| 久久这里只精品99re免费 | 亚洲熟妇丰满xxxxx| 国产免费69成人精品视频| 免费无码婬片aaa直播表情| 亚洲一区二区三区乱码A| 两个人看的www高清免费视频| 久久精品7亚洲午夜a| 69精品免费视频| 亚洲欧美日韩久久精品| 亚洲精品第一国产综合境外资源| 久久久久女教师免费一区| 久久久久亚洲AV无码网站| 性xxxx视频播放免费| 一级做a爰片久久免费| 亚洲视频在线观看| 成人最新午夜免费视频| 一级片在线免费看| 91亚洲一区二区在线观看不卡| 最近的中文字幕大全免费版| 日韩电影免费在线观看网址| 亚洲综合成人网在线观看| 卡一卡二卡三在线入口免费| 中文字幕永久免费| 亚洲AV成人影视在线观看| 自拍偷自拍亚洲精品被多人伦好爽| 97精品免费视频| 羞羞漫画页面免费入口欢迎你|