1. 程式人生 > >Session的各個監聽的使用

Session的各個監聽的使用

session listener的配置和使用

web.xml中增加listener的配置資訊   
     <listener>
        <listener-class>
            com.SessionListener
(實現session監聽器介面的類的名字,包也要寫上)
        </listener-class>
    </listener>
    <listener>
        <listener-class>
            com.AnotherSessionListener

(有多個session監聽器的時候,加多個<listener>)
        </listener-class>
    </listener>

JDK1.51.6javax.servlet.http包中,可以看到session的監聽器介面有4個,

要使用這些session的監聽器,必須建立一個實現這些監聽器介面的類,並在web.xml中配置這個類或者在會捆綁到session中的物件中實現監聽器介面。

1.   HttpSessionListener:在WEB應用中,當一個session被建立或銷燬時啟用這個監聽器。

       HttpSessionListener

介面定義了兩個方法:( se)void( se)每個方法都接受一個HttpSessionEvent物件作為引數。(實現類要提供一個無引數的建構函式)

官方英文說明:Implementations of this interface are notified of changes to the list of active sessions in a web application. To receive notification events, the implementation class must be configured in the deployment descriptor for the web application.

package com;

public class SessionListener  implements HttpSessionListenter {

           public SessionListener() { }; //無參構造方法

           //session被建立時執行這個方法

            public void sessionCreated(HttpSessionEvent event) {

                 //程式碼

             } 

            //session被銷燬時執行這個方法

            public void sessionDestoryed(HttpSessionEvent event) {

                 //程式碼

            } 

            .....................................................

}

2.   HttpSessionAttributeListener :在當前的WEB應用中,當sessionattribute被增加、移除或替換後啟用這個監聽器。

官方英文說明:This listener interface can be implemented in order to get notifications of changes to the attribute lists of sessions within this web application.

具體的實現類定義跟上邊的差不多,這裡就只寫明介面定義的方法在什麼情況下將會執行,後面也將是這樣帶過。

void attributeAdded(HttpSessionBindingEvent se) ; //當一個attribute被增加到session後執行這個方法

void attributeRemoved(HttpSessionBindingEvent se);//當一個attribute被從session中移除後執行這個方法

void attributeReplaced(HttpSessionBindingEvent se);//當一個attribute中的值被替換後執行這個方法

注意上面兩個必須在web.xml中配置, 這是為了比較第三個監聽器,因為你想使用第三個監聽器,那你必須把它佈置到準備捆綁到session中的物件,這個物件必須是implements HttpSessionBindingListener

3.    HttpSessionBindingListener:當一個實現了該介面的物件被捆綁到session或從session中被解放的時候啟用這個監聽器。(不明白的可以查考的說明方法)

官方英文說明:Causes an object to be notified when it is bound to or unbound from a session. The object is notified by an HttpSessionBindingEvent object. This may be as a result of a servlet programmer explicitly unbinding an attribute from a session, due to a session being invalidated, or due to a session timing out.

       //當物件被捆綁到session中時執行這個方法,像HttpSession.setAttribute("Aname",this_Object);這個方法執行後,將呼叫下面的方法,並啟用HttpSessionAttributeListener 監聽器void valueBound( HttpSessionBindingEvent arg2 )

       //當物件從session中被解放時執行這個方法,像HttpSession.setAttribute("Aname",this_Object);執行後,再執行HttpSession.setAttribute("Aname",another_Object);方法或者HttpSession.setAttribute("Aname",“ ”);方法或者removeAttribute("Aname")後,將呼叫下面的方法,並啟用HttpSessionAttributeListener 監聽器void valueUnbound( HttpSessionBindingEvent arg1 ) 

4.    HttpSessionActivationListener :用於分散式服務中,當會話被啟用時呼叫相應的事件。

HttpSessionActivationListener介面定義了兩個方法:void sessionWillPassivate(HttpSessionEvent se) void sessionDidActivate(HttpSessionEvent se),每個方法都接受一個HttpSessionEvent物件作為引數。

官方英文說明:Objects that are bound to a session may listen to container events notifying them that sessions will be passivated and that session will be activated. A container that migrates session between VMs or persists sessions is required to notify all attributes bound to sessions implementing HttpSessionActivationListener. (說實話,這個我看不懂, 當物件所捆綁著的session將被阻塞或啟用的時候,捆綁著這個session的物件可能聽從通知它的容器事件。當session在虛擬機器之間、或在持久儲存裝置中移動時,它就會被阻塞或者啟用,容器被要求去通知所有捆綁著session並實現HttpSessionActivationListener介面的attribute物件。我是這樣翻譯的啦,看了的朋友如果覺得有問題,不吝指教)

//session即將被阻塞時執行這個方法

void sessionWillPassivate(HttpSessionEvent se)

//session剛被啟用時執行這個方法

void sessionDidActivate(HttpSessionEvent se)

下面是HttpSessionEvent類的方法

public HttpSession getSession()

HttpSessionBindingEvent類的方法

public HttpSession getSession()

public java.lang.String getName();

public java.lang.Object getValue()

下面是兩個類都有的通過繼承得到的方法

Methods inherited from class java.util.EventObject

getSource, toString

Methods inherited from class java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

***********************************************************************************************

在網站中經常需要進行線上人數的統計。過去的一般做法是結合登入和退出功能,即當用戶輸入使用者名稱密碼進行登入的時候計數器加1,然後當用戶點選退出按鈕退出系統的時候計數器減1。這種處理方式存在一些缺點,例如:使用者正常登入後,可能會忘記點選退出按鈕,而直接關閉瀏覽器,導致計數器減1的操作沒有及時執行;網站上還經常有一些內容是不需要登入就可以訪問的,在這種情況下也無法使用上面的方法進行線上人數統計。
  我們可以利用Servlet規範中定義的事件監聽器(Listener)來解決這個問題,實現更準確的線上人數統計功能。對每一個正在訪問的使用者,J2EE應用伺服器會為其建立一個對應的HttpSession物件。當一個瀏覽器第一次訪問網站的時候,J2EE應用伺服器會新建一個HttpSession物件,並觸發HttpSession建立事件,如果註冊了HttpSessionListener事件監聽器,則會呼叫HttpSessionListener事件監聽器的sessionCreated方法。相反,當這個瀏覽器訪問結束超時的時候,J2EE應用伺服器會銷燬相應的HttpSession物件,觸發HttpSession銷燬事件,同時呼叫所註冊HttpSessionListener事件監聽器的sessionDestroyed方法。
  可見,對應於一個使用者訪問的開始和結束,相應的有sessionCreated方法和sessionDestroyed方法執行。這樣,我們只需要在HttpSessionListener實現類的sessionCreated方法中讓計數器加1,在sessionDestroyed方法中讓計數器減1,就輕鬆實現了網站線上人數的統計功能
**********************************************************************************************
package com.vsj;

import java.util.HashSet;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * 伺服器session監聽器
 *
 * @author Administrator
 *
 */
public class MySessionListener implements HttpSessionListener {
 private HashSet<Object> sessions=new HashSet<Object>();
 
 /**
  * 沒一個客戶第一次與伺服器建立連線,都將呼叫此方法
  */
 public void sessionCreated(HttpSessionEvent event) {
  System.out.println("===新客戶連線===");
  HttpSession session=event.getSession();
  //獲得Servlet上下文,這是所有使用者共享的資料空間
  ServletContext context=event.getSession().getServletContext();
  
  sessions=(HashSet<Object>)context.getAttribute("ClientCount");
  if(sessions==null){
   sessions=new HashSet<Object>();
   context.setAttribute("ClientCount", sessions);
   
  } 
  
  sessions.add(session);  
  //在需要用到的地方可以獲取servletConext中的ClientCount取出
 }
 
 /**
  * 當用戶呼叫session.invalidate()方法銷燬session的時候,將呼叫此方法
  */
 public void sessionDestroyed(HttpSessionEvent event) {
  // TODO Auto-generated method stub
  System.out.println("===客戶退出連線===");
  HttpSession session=event.getSession();
  //獲得Servlet上下文,這是所有使用者共享的資料空間
  ServletContext context=event.getSession().getServletContext();
  
  sessions=(HashSet<Object>)context.getAttribute("ClientCount");
  if(sessions==null){
   sessions=new HashSet<Object>();
   context.setAttribute("ClientCount", sessions);
   
  } 
  
  sessions.remove(session);
 }
 
 
}
*********************************************************************************
在web.xml 中新增
 <session-config>
   <session-timeout>1</session-timeout><!-- session的過期時間,單位分 -->
  </session-config>
  <listener>
   <listener-class>
    com.vsj.MySessionListener
   </listener-class>
  </listener>
*********************************************************************************
使用:
 <%
     ServletContext context=request.getSession().getServletContext();
     HashSet sessions=(HashSet)context.getAttribute("ClientCount");
     if(sessions!=null){
      out.println("<font style='color:red;'>當前使用者的數量:"+sessions.size()+"</font>");
     }
     
     %>

相關推薦

Session各個的使用

session listener的配置和使用 在web.xml中增加listener的配置資訊         <listener>         <listener-class>             com.SessionListener(

Spring MVC 下Session監聽器設定小細節

今天在SpringMVC專案中加入了一個Session監聽事件,當在web.xml中註冊後啟動專案一直報異常,之後查證後發現,原來session監聽類中不能進行依賴注入,而我同時又必須要用注入方式進行例項化,最終經過多次試驗,終於解決了問題,下面是具體程式碼: //記得 到

Spring session 失效方法

con eve spring註解 無法 nco clas textutils creat 監聽器 public class SessionCounter implements HttpSessionListener { private static int activ

JS 瀏覽器各個標籤間的切換

這篇文章是別人寫的,覺得挺實用就搬過來了,跟大家分享一下。 以前看到過一些網頁,在標籤切換到其它地址時,網頁上的標題上會發生變化,一直不知道這個是怎麼做的,最近查了一些資料才發現有一個 visibilitychange 事件就可以搞定,這裡將介紹一下頁面可見性(Page Visibility)API的簡單應

springboot session

配置 package com.***.config; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.co

HttpSessionListener 實現類 session創建於銷燬時的動作

監聽 session創建於銷燬時的動作 ,用於使用者安全相關問題是的統計,登出等操作 使用方法: 在web.xml檔案中新增listener <listener>     <listener-class>路徑.sessionlistener&l

spring session redis 實現叢集session共享,SessionListener生效

pom主要配置 <properties> <spring.version>5.0.3.RELEASE</spring.version> <commons-lang.version

Spring boot 專案HttpSessionListener用於session失效時移除線上使用者的全域性引數

在專案中會出現使用者不點選登出時間觸發session.invalidate()方法,此時我們就無法確定使用者的實際登入狀態,再次我們使用HttpSessionListener監聽器來管理使用者session失效,進而解決了線上使用者的統計或者全域性引數的控制 值得注意的是: @Se

spring boot之session的建立,銷燬,超時,等等小結

一、 session簡介 1. 伺服器可以為每個使用者瀏覽器建立一個會話物件(session物件),一個瀏覽器只能產生一個session,當新建一個視窗訪問伺服器時,還是原來的那個session。session中預設儲存的是當前使用者的資訊。因此,在需要儲存其他使用者資料時

解決使用tomcat-redis-session-manager httpSessionLinster功能失效問題

使用tomcat-redis-session-manager做session redis化有一個坑就是,程式碼tomcat-redis-session-manager本身對session的生命週期控制使用了redis的exprie看看程式碼。。 RedisSessionMa

HttpSessionListenerSession的建立和失效

   Session建立事件發生在每次一個新的session建立的時候,類似地Session失效事件發生在每次一個Session失效的時候。 這個介面也只包含兩個方法,分別對應於Session的建立和失效: # public void sessionCreated(HttpSessionEvent se

Session統計網站的線上人數HashSet

import java.util.ArrayList; import java.util.HashSet; import java.util.List; import javax.servlet.S

Java Web入門之session的銷燬

統計線上使用者數等功能需要監聽session的銷燬,有兩種方式: 1. 使用HttpSessionListener監聽session的銷燬。 2. 使用HttpSessionBindingListener監聽session的銷燬。 使用HttpSess

shiro session

spring 使用 shiro 後,由於shiro重新封裝了原有的session,所以不能再使用原來的session監聽方法了 (1)在shiro配額只檔案中設定監聽類 <!-- shiroS

request session servletContext的建立與銷燬

監聽器:  * Java Web的三大元件:Servlet、Listener、Filter.  * 注意:    * listener的觸發或呼叫,是不需要我們關注的.(Tomcat伺服器)    * Tomcat與JavaEE的版本是有對應的.      * Tomcat

使用HttpSessionListener介面Session的建立和失效(可以用於統計線上人數)

轉自:http://uule.iteye.com/blog/824115 HttpSessionListener :    Session建立事件發生在每次一個新的session建立的時候,類似地Session失效事件發生在每次一個Session失效的時

【監聽器篇】1.request、ServletContext 、session物件的建立和銷燬

1.監聽器知識點  簡單來說,監聽器是監聽一個物件發生的什麼事,然後監聽器做出相應的反應。這就是我們的監聽器,用我們專業的話來說:監聽器負責監聽事件源的事件。  事件源:發生事件的源頭,監聽器需要監聽的物件。  事件:事件源上發生的動作,監聽器監聽的內容。  監聽器:負責監聽

Session線上統計人數,簡單的單點登入

import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import jav

session實現唯一登入及普通類呼叫Service層的方法的實現思路

最近在寫專案的時候遇到一個問題:如何實現使用者唯一登入?一開始的想法是給t_user表新增一個欄位login_status(登入狀態),使用者登入前去查詢t_user的login_status的值,login_status為未登入狀態,則可以進行登入;否則,不能

java通過Session實現統計線上使用者

package com.boventech.learning.listener; import java.util.HashSet; import java.util.Set; import ja