1、過濾器的基本概念
現(xiàn)實(shí)中的監(jiān)聽器
定義:
是指專門用于對(duì)其他對(duì)象身上發(fā)生的事件或狀態(tài)改變進(jìn)行監(jiān)聽和相應(yīng)處理的對(duì)象,當(dāng)被監(jiān)視的對(duì)象發(fā)生變化時(shí),立即采取相應(yīng)的行動(dòng)。
web監(jiān)聽器:
- 是Servlet規(guī)范中定義的一種特殊類。
- 主要功能是負(fù)責(zé)監(jiān)聽Web的各種操作(客戶端的請(qǐng)求、服務(wù)端的操作),當(dāng)相關(guān)的事件觸發(fā)后將產(chǎn)生事件,并對(duì)事件進(jìn)行處理。
- 用于監(jiān)聽的對(duì)象:ServletContext(application)、HttpSession(session)和ServletRequest(request)3個(gè)域?qū)ο蟆?/li>
- 用于監(jiān)聽域?qū)ο蟮膭?chuàng)建、銷毀、屬性變化。
- 可以在事件發(fā)生前、發(fā)生后做一些必要的處理。
2、Web監(jiān)聽器的用途
- 統(tǒng)計(jì)在線人數(shù)和在線用戶
- 系統(tǒng)啟動(dòng)時(shí)加載初始化信息
- 統(tǒng)計(jì)網(wǎng)站訪問量
- 跟Spring結(jié)合
3、創(chuàng)建web監(jiān)聽器
步驟:
- 創(chuàng)建一個(gè)實(shí)現(xiàn)監(jiān)聽器接口的類
- 配置web.xml進(jìn)行注冊(cè)

3、監(jiān)聽器的分類
- 按監(jiān)聽的對(duì)象劃分
- 用于監(jiān)聽?wèi)?yīng)用程序環(huán)境對(duì)象的事件監(jiān)聽器 (ServletContext)
- 用于監(jiān)聽用戶會(huì)話對(duì)象的事件監(jiān)聽器 (HttpSession)
- 用于監(jiān)聽請(qǐng)求消息對(duì)象的事件監(jiān)聽器 (ServletRequest)
- 按監(jiān)聽的事件劃分
- 監(jiān)聽域?qū)ο笞陨淼膭?chuàng)建和銷毀的事件監(jiān)聽器
- 監(jiān)聽對(duì)象中屬性的增加和刪除的事件監(jiān)聽器
- 監(jiān)聽綁定到HttpSession域中的某個(gè)對(duì)象的狀態(tài)的事件監(jiān)聽器



session頓化機(jī)制(在開發(fā)中用的并不是很多)




4、對(duì)application監(jiān)聽(ServletContext)

主要使用ServletContextListener和ServletContextAttributeListener兩個(gè)接口
- 上下文狀態(tài)監(jiān)聽:ServletContextListener接口
實(shí)現(xiàn)javax.servlet.ServletContextListener
public void contextInitialized(ServletContextEvent event) //容器啟動(dòng)時(shí)觸發(fā)
public void contextDestroyed(ServletContextEvent event) //容器銷毀時(shí)觸發(fā)
在上下文監(jiān)聽操作中,一旦觸發(fā)了ServletContextListener接口中定義的事件后,可 以通過ServletContextEvent進(jìn)行事件的處理,該事件中定義的方法:
public ServletContext getServletContext() //取得ServletContext對(duì)象
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServletContextListenerDemo implements ServletContextListener {
@Override
public void contextDestroyed(ServletContextEvent event) {
System.out.println("銷毀--" + event.getServletContext().getContextPath());
}
@Override
public void contextInitialized(ServletContextEvent event) {
System.out.println("初始化--" + event.getServletContext().getContextPath());
}
}
web.xml配置
<listener>
<listener-class>com.meng.listener.ServletContextListenerDemo</listener-class>
</listener>
- 上下文屬相監(jiān)聽:ServletContextAttributeListener接口
實(shí)現(xiàn)javax.servlet.ServletContextAttributeListener
public void attributeAdded(ServletContextAttributeEvent event) //增加屬性時(shí)觸發(fā)
public void attributeRemoved(ServletContextAttributeEvent event) //刪除屬性時(shí)觸發(fā)
public void attributeReplaced(ServletContextAttributeEvent event) //替換屬性時(shí)觸發(fā)
在上下文監(jiān)聽操作中,一旦觸發(fā)了ServletContextAttributeListener接口中定義的事件后,可 以通過ServletContextAttributeEvent進(jìn)行事件的處理,該事件中定義的方法:
public String getName() //取得設(shè)置的屬性名稱
public Object getValue() //取得設(shè)置的屬性內(nèi)容
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class ServletContextAttributeListenerDemo implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("增加屬性:屬性名稱->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
System.out.println("刪除屬性:屬性名稱->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
System.out.println("替換屬性:屬性名稱->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
}
web.xml配置
<listener>
<listener-class>com.meng.listener.ServletContextAttributeListenerDemo</listener-class>
</listener>
5、對(duì)session監(jiān)聽(HttpSession)

主要使用HttpSessionListener、HttpSessionAttributeListener、HttpSessionBindingListener接口
- session狀態(tài)監(jiān)聽:HttpSessionListener接口
實(shí)現(xiàn)javax.servlet.http.HttpSessionListener監(jiān)聽session的創(chuàng)建或銷毀。
public void sessionCreated(HttpSessionEvent event) //session創(chuàng)建時(shí)調(diào)用
public void sessionDestroyed(HttpSessionEvent event) //session銷毀時(shí)調(diào)用
當(dāng)session創(chuàng)建或銷毀后,將產(chǎn)生HttpSessionEvent事件:
public HttpSession getSession() //取得當(dāng)前的session
package com.meng.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class HttpSessionListenerDemo implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
System.out.println("創(chuàng)建session--" + event.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent event) {
System.out.println("銷毀session--" + event.getSession().getId());
}
}
web.xml
<listener>
<listener-class>com.meng.listener.HttpSessionListenerDemo</listener-class>
</listener>
session什么時(shí)候銷毀的?
(1)關(guān)閉服務(wù)器
(2)關(guān)閉瀏覽器一段時(shí)間,直到session過期
(3)不關(guān)閉瀏覽器,session超時(shí)
session銷毀的操作
當(dāng)一個(gè)新用戶打開一個(gè)動(dòng)態(tài)也時(shí),服務(wù)器會(huì)為新用戶分配session,并且觸發(fā)HttpSessionListener接口中的sessionCreated()事件,但是在用戶銷毀時(shí)卻有兩種不同的 方式來觸發(fā)sessionDestroyed()事件。
- 方式一:調(diào)用HttpSession接口的invalidate()方法,讓一個(gè)session失效。
- 方式二:超過了配置是session超時(shí)時(shí)間,session超時(shí)時(shí)間可以直接在項(xiàng)目的web.xml中配置。
<session-config>
<session-timeout>5</session-timeout>
</session-config>
以上將一個(gè)session的超時(shí)時(shí)間設(shè)置成了5分鐘,如果一個(gè)用戶在5分鐘后沒有與服務(wù)器進(jìn)行任何交互操作的話,那么服務(wù)器會(huì)認(rèn)為此用戶已經(jīng)離開,會(huì)自動(dòng)將其注銷。
如果沒有在項(xiàng)目中設(shè)置超時(shí)時(shí)間,則默認(rèn)的超時(shí)時(shí)間為30分鐘。
- session屬性監(jiān)聽:HttpSessionAttributeListener接口
實(shí)現(xiàn)javax.servlet.http.HttpSessionAttributeListener
public void attributeAdded(HttpSessionBindingEvent event) //增加屬性時(shí)觸發(fā)
public void attributeRemoved(HttpSessionBindingEvent event) //刪除屬性時(shí)觸發(fā)
public void attributeReplaced(HttpSessionBindingEvent event) //替換屬性時(shí)觸發(fā)
HttpSessionBindingEvent事件的方法
public HttpSession getSession() //取得session
public String getName() //取得屬性名稱
public Object getValue() //取得屬性內(nèi)容
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class HttpSessionAttributeListenerDemo implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println(event.getSession().getId() + "增加屬性:屬性名稱->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println(event.getSession().getId() + "刪除屬性:屬性名稱->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println(event.getSession().getId() + "替換屬性:屬性名稱->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
}
web.xml
<listener>
<listener-class>com.meng.listener.HttpSessionAttributeListenerDemo</listener-class>
</listener>
- session屬性監(jiān)聽:HttpSessionBindingListener接口
實(shí)現(xiàn)javax.servlet.http.HttpSessionBindingListener接口的監(jiān)聽程序可以不用再web.xml中配置而直接使用。
public void valueBound(HttpSessionBindingEvent event) //綁定對(duì)象到session時(shí)觸發(fā)
public void valueUnbound(HttpSessionBindingEvent event) //從session中移除對(duì)象時(shí)觸發(fā)
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class HttpSessionBindingListenerDemo implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
}
}
HttpSessionAttributeListener和HttpSessionBindingListener兩個(gè)監(jiān)聽接口的作用類似,只是一個(gè)需要配置,一個(gè)不需要配置。
6、對(duì)request監(jiān)聽(ServletRequest)

在servlet2.4之后增加了對(duì)request操作的監(jiān)聽,主要使用ServletRequestListener、ServletRequestAttributeListener兩個(gè)接口。
- 請(qǐng)求狀態(tài)監(jiān)聽:ServletRequestListener接口
當(dāng)需要對(duì)用戶的每次請(qǐng)求進(jìn)行監(jiān)聽時(shí),可以實(shí)現(xiàn)javax.servlet.ServletRequestListener接口
public void requestInitialized(ServletRequestEvent event) //請(qǐng)求開始時(shí)調(diào)用
public void requestDestroyed(ServletRequestEvent event) //請(qǐng)求結(jié)束時(shí)調(diào)用
ServletRequestListener接口一旦監(jiān)聽到事件后,將產(chǎn)生ServletRequestEvent的事件處理對(duì)象。
public ServletRequest getServletRequest() //取得ServletRequest對(duì)象
public ServletContext getServletContext() //取得ServletContext對(duì)象
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class ServletRequestListenerDemo implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent event) {
}
@Override
public void requestInitialized(ServletRequestEvent event) {
}
}
web.xml
<listener>
<listener-class>com.meng.listener.ServletRequestListenerDemo</listener-class>
</listener>
- request屬性監(jiān)聽:ServletRequestAttributeListener接口
實(shí)現(xiàn)javax.servlet.ServletRequestAttributeListener接口
public void attributeAdded(ServletRequestAttributeEvent event)
public void attributeRemoved(ServletRequestAttributeEvent event)
public void attributeReplaced(ServletRequestAttributeEvent event)
public String getName() //取得屬性名稱
public Object getValue() //取得屬性內(nèi)容
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class ServletRequestAttributeListenerDemo implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent event) {
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent event) {
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent event) {
}
}
web.xml
<listener>
<listener-class>com.meng.listener.ServletRequestAttributeListenerDemo</listener-class>
</listener>
7、servlet3.0下監(jiān)聽器的使用


