Session的各個監聽的使用
session listener的配置和使用
在web.xml中增加listener的配置資訊
<listener>
<listener-class>
com.SessionListener(實現session監聽器介面的類的名字,包也要寫上)
</listener-class>
</listener>
<listener>
<listener-class>
com.AnotherSessionListener
</listener-class>
</listener>
在JDK1.5和1.6的javax.servlet.http包中,可以看到session的監聽器介面有4個,
要使用這些session的監聽器,必須建立一個實現這些監聽器介面的類,並在web.xml中配置這個類或者在會捆綁到session中的物件中實現監聽器介面。
1. HttpSessionListener:在WEB應用中,當一個session被建立或銷燬時啟用這個監聽器。
HttpSessionListener
官方英文說明: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應用中,當session的attribute被增加、移除或替換後啟用這個監聽器。
官方英文說明: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
HttpSessionListener監聽Session的建立和失效
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