1漓柑、過(guò)濾器的基本概念
現(xiàn)實(shí)中的監(jiān)聽(tīng)器
定義:
是指專(zhuān)門(mén)用于對(duì)其他對(duì)象身上發(fā)生的事件或狀態(tài)改變進(jìn)行監(jiān)聽(tīng)和相應(yīng)處理的對(duì)象,當(dāng)被監(jiān)視的對(duì)象發(fā)生變化時(shí),立即采取相應(yīng)的行動(dòng)。
web監(jiān)聽(tīng)器:
- 是Servlet規(guī)范中定義的一種特殊類(lèi)排吴。
- 主要功能是負(fù)責(zé)監(jiān)聽(tīng)Web的各種操作(客戶端的請(qǐng)求、服務(wù)端的操作)懦鼠,當(dāng)相關(guān)的事件觸發(fā)后將產(chǎn)生事件,并對(duì)事件進(jìn)行處理屹堰。
- 用于監(jiān)聽(tīng)的對(duì)象:ServletContext(application)肛冶、HttpSession(session)和ServletRequest(request)3個(gè)域?qū)ο蟆?/li>
- 用于監(jiān)聽(tīng)域?qū)ο蟮膭?chuàng)建、銷(xiāo)毀扯键、屬性變化睦袖。
- 可以在事件發(fā)生前、發(fā)生后做一些必要的處理荣刑。
2馅笙、Web監(jiān)聽(tīng)器的用途
- 統(tǒng)計(jì)在線人數(shù)和在線用戶
- 系統(tǒng)啟動(dòng)時(shí)加載初始化信息
- 統(tǒng)計(jì)網(wǎng)站訪問(wèn)量
- 跟Spring結(jié)合
3伦乔、創(chuàng)建web監(jiān)聽(tīng)器
步驟:
- 創(chuàng)建一個(gè)實(shí)現(xiàn)監(jiān)聽(tīng)器接口的類(lèi)
- 配置web.xml進(jìn)行注冊(cè)
3、監(jiān)聽(tīng)器的分類(lèi)
- 按監(jiān)聽(tīng)的對(duì)象劃分
- 用于監(jiān)聽(tīng)?wèi)?yīng)用程序環(huán)境對(duì)象的事件監(jiān)聽(tīng)器 (ServletContext)
- 用于監(jiān)聽(tīng)用戶會(huì)話對(duì)象的事件監(jiān)聽(tīng)器 (HttpSession)
- 用于監(jiān)聽(tīng)請(qǐng)求消息對(duì)象的事件監(jiān)聽(tīng)器 (ServletRequest)
- 按監(jiān)聽(tīng)的事件劃分
- 監(jiān)聽(tīng)域?qū)ο笞陨淼膭?chuàng)建和銷(xiāo)毀的事件監(jiān)聽(tīng)器
- 監(jiān)聽(tīng)對(duì)象中屬性的增加和刪除的事件監(jiān)聽(tīng)器
- 監(jiān)聽(tīng)綁定到HttpSession域中的某個(gè)對(duì)象的狀態(tài)的事件監(jiān)聽(tīng)器
session頓化機(jī)制(在開(kāi)發(fā)中用的并不是很多)
4董习、對(duì)application監(jiān)聽(tīng)(ServletContext)
主要使用ServletContextListener和ServletContextAttributeListener兩個(gè)接口
- 上下文狀態(tài)監(jiān)聽(tīng):ServletContextListener接口
實(shí)現(xiàn)javax.servlet.ServletContextListener
public void contextInitialized(ServletContextEvent event) //容器啟動(dòng)時(shí)觸發(fā)
public void contextDestroyed(ServletContextEvent event) //容器銷(xiāo)毀時(shí)觸發(fā)
在上下文監(jiān)聽(tīng)操作中烈和,一旦觸發(fā)了ServletContextListener接口中定義的事件后,可 以通過(guò)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("銷(xiāo)毀--" + 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)聽(tīng):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)聽(tīng)操作中招刹,一旦觸發(fā)了ServletContextAttributeListener接口中定義的事件后,可 以通過(guò)ServletContextAttributeEvent進(jìn)行事件的處理窝趣,該事件中定義的方法:
public String getName() //取得設(shè)置的屬性名稱(chēng)
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("增加屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
System.out.println("刪除屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
System.out.println("替換屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
}
web.xml配置
<listener>
<listener-class>com.meng.listener.ServletContextAttributeListenerDemo</listener-class>
</listener>
5疯暑、對(duì)session監(jiān)聽(tīng)(HttpSession)
主要使用HttpSessionListener、HttpSessionAttributeListener哑舒、HttpSessionBindingListener接口
- session狀態(tài)監(jiān)聽(tīng):HttpSessionListener接口
實(shí)現(xiàn)javax.servlet.http.HttpSessionListener監(jiān)聽(tīng)session的創(chuàng)建或銷(xiāo)毀妇拯。
public void sessionCreated(HttpSessionEvent event) //session創(chuàng)建時(shí)調(diào)用
public void sessionDestroyed(HttpSessionEvent event) //session銷(xiāo)毀時(shí)調(diào)用
當(dāng)session創(chuàng)建或銷(xiāo)毀后,將產(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("銷(xiāo)毀session--" + event.getSession().getId());
}
}
web.xml
<listener>
<listener-class>com.meng.listener.HttpSessionListenerDemo</listener-class>
</listener>
session什么時(shí)候銷(xiāo)毀的洗鸵?
(1)關(guān)閉服務(wù)器
(2)關(guān)閉瀏覽器一段時(shí)間越锈,直到session過(guò)期
(3)不關(guān)閉瀏覽器,session超時(shí)
session銷(xiāo)毀的操作
當(dāng)一個(gè)新用戶打開(kāi)一個(gè)動(dòng)態(tài)也時(shí)预麸,服務(wù)器會(huì)為新用戶分配session瞪浸,并且觸發(fā)HttpSessionListener接口中的sessionCreated()事件,但是在用戶銷(xiāo)毀時(shí)卻有兩種不同的 方式來(lái)觸發(fā)sessionDestroyed()事件吏祸。
- 方式一:調(diào)用HttpSession接口的invalidate()方法对蒲,讓一個(gè)session失效。
- 方式二:超過(guò)了配置是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分鐘后沒(méi)有與服務(wù)器進(jìn)行任何交互操作的話鸣驱,那么服務(wù)器會(huì)認(rèn)為此用戶已經(jīng)離開(kāi)泛鸟,會(huì)自動(dòng)將其注銷(xiāo)。
如果沒(méi)有在項(xiàng)目中設(shè)置超時(shí)時(shí)間踊东,則默認(rèn)的超時(shí)時(shí)間為30分鐘北滥。
- session屬性監(jiān)聽(tīng):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() //取得屬性名稱(chēng)
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() + "增加屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println(event.getSession().getId() + "刪除屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println(event.getSession().getId() + "替換屬性:屬性名稱(chēng)->" + event.getName() + "屬性內(nèi)容->" + event.getValue());
}
}
web.xml
<listener>
<listener-class>com.meng.listener.HttpSessionAttributeListenerDemo</listener-class>
</listener>
- session屬性監(jiān)聽(tīng):HttpSessionBindingListener接口
實(shí)現(xiàn)javax.servlet.http.HttpSessionBindingListener接口的監(jiān)聽(tīng)程序可以不用再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)聽(tīng)接口的作用類(lèi)似闸翅,只是一個(gè)需要配置再芋,一個(gè)不需要配置。
6坚冀、對(duì)request監(jiān)聽(tīng)(ServletRequest)
在servlet2.4之后增加了對(duì)request操作的監(jiān)聽(tīng)济赎,主要使用ServletRequestListener、ServletRequestAttributeListener兩個(gè)接口。
- 請(qǐng)求狀態(tài)監(jiān)聽(tīng):ServletRequestListener接口
當(dāng)需要對(duì)用戶的每次請(qǐng)求進(jìn)行監(jiān)聽(tīng)時(shí)司训,可以實(shí)現(xiàn)javax.servlet.ServletRequestListener接口
public void requestInitialized(ServletRequestEvent event) //請(qǐng)求開(kāi)始時(shí)調(diào)用
public void requestDestroyed(ServletRequestEvent event) //請(qǐng)求結(jié)束時(shí)調(diào)用
ServletRequestListener接口一旦監(jiān)聽(tīng)到事件后构捡,將產(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)聽(tīng):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() //取得屬性名稱(chēng)
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>