Listenerリスナーの構成


  • 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定義の2つの方法:sessionCreated()とsessionDestroyed()を実現した.この2つの方法は、現在のアプリケーションにおけるsessionの作成と破棄状況を傍受することができる.ここではsessionDestroyed()がsession破棄時に操作するだけでよい.
    破棄するセッションをHttpSessionEventから取得し、セッションのユーザー名を取得し、オンラインリストから削除します.最後の文はconsoleにメッセージを印刷し、操作に成功したことを示します.これはデバッグ用に、正常な実行時に削除するだけです.
    リスナーが機能するようにwebに追加します.xml:
    <listener>
      <listener-class>anni.OnlineUserListener</listener-class>
    </listener>
             

    セッションの破棄イベントは、次の2つの場合に発生します.
  • セッションを実行する.invalidate()メソッドの場合.それ以上はJAvaでセッションを実行します.invalidate()の場合、sessionDestory()がオンラインユーザーリストから現在のユーザーを消去するようにトリガーされます.JAvaでオンラインリストが操作されているのでLogoutServeret.JAvaの内容は今こうです.
    public void doGet(HttpServletRequest request,HttpServletResponse response)
        throws ServletException, IOException {
        //   session
        request.getSession().invalidate();
        //   
        response.sendRedirect("index.jsp");
    }
                     
  • ユーザーが長時間サーバにアクセスしていない場合、セッションの最大タイムアウト時間を超えると、サーバはタイムアウトしたセッションを自動的に破棄します.セッションタイムアウト時間はwebでよい.xmlで設定を行い、タイムアウト効果がわかりやすいようにタイムアウト時間を最小値に設定します.
    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>
                     
    時間単位は1分で、整数のみで、ゼロまたは負数の場合、セッションはタイムアウトしません.

  • 対応例は08-01で、OnlineUserListenerが正常に実行できるかどうかを検証するために、2人のユーザーにログインし、そのうちの1人はログアウトをクリックし、もう1人は1分待ってからconsoleで出力の情報を見ることができます.
    8.2.HttpSessionBindingListenerの使用
    HttpSessionBindingListenerはListenerと呼ばれますが、使い方はHttpSessionListenerとは全く違います.実際にどのように使われているかを見てみましょう.
    我々のOnlineUserBindingListenerはHttpSessionBindingListenerインタフェースを実現し、インタフェースはvalueBound()とvalueUnbound()の2つの方法を定義し、それぞれデータバインディングに対応し、2つのイベントをバインディング解除します.
    セッションをデータバインディングとは、セッションを呼び出すことである.setAttribute()HttpSessionBindingListenerをセッションに保存します.我々はここにいるJAvaでこのステップを行います.
    //           
    session.setAttribute("onlineUserBindingListener", new OnlineUserBindingListener(username));
             

    これがHttpSessionBindingListenerとHttpSessionListenerの最大の違いである:HttpSessionListenerはwebに設定するだけである.xmlでは、アプリケーション全体のすべてのセッションをリスニングできます.HttpSessionBindingListenerは、リスニングを行うためにインスタンス化されたセッションに入れなければなりません.
    傍受範囲から比較すると、HttpSessionListenerは一度に設定するとすべてのsessionを傍受することができ、HttpSessionBindingListenerは通常1対1である.
    このような違いこそH ttpSessionBindingListenerの優位性を達成し、listenerごとに1つの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のトリガ条件は、次の3つです.
  • セッションを実行する.invalidate()の場合.
  • セッションタイムアウト、自動破棄時.
  • セッションを実行する.setAttribute(「onlineUserListener」、「その他のオブジェクト」);またはセッションremoveAttribute("onlineUserListener");セッションからlistenerを削除する場合.

  • したがって,listenerをセッションから削除しない限り,セッションの破棄を傍受することができる.