天天看點

Servlet過濾器和監聽器過濾器 監聽器監聽器應用場景

過濾器

顧名思義是起到過濾的作用,所有的請求在真正到達servlet之前都會首先經過過濾器過濾一遍。過濾器也是 Servlet的一種,是以也有init和destroy方法,還有一個服務方法service,隻是這裡提供的服務是過濾; 一個Servlet要想成為過濾器需要 實作javax.servlet.Filter 接口 ;

一般用戶端送出請求後會交給Servlet;如果過濾器存在,則用戶端發出的請求都是先交給過濾器,然後交給Servlet;

我們可以完成一些在執行Servlet之前必須要做的事,比如request.setCharacterEncoding("GBK");

必須實作以下方法:

1.public void init(FilterConfig config) throws ServletException{}   //   init方法在Web容器啟動時就會調用;

2.public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain){}  // doFilter的參數是ServletRequest和ServletResponse而不是Http的;

3.public void destroy(){}//應用被關閉時調用

在實作doFilter方法時一定要執行如下操作:

public void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain){

    chain.doFilter(req,resp);        //向servlet傳遞請求,否則servlet無法執行

}

寫完過濾器後,我們必須要限制過濾器調用的範圍,即域名為多少時會調用過濾器,我們在web.xml 中進行配置

  1. <filter>  
  2.     <filter-name>myFilter</filter-name><!--filter的名字-->  
  3.     <filter-class>com.lq.Filter.Myfilter</filter-class><!--filter的類全路徑-->  
  4. </filter>  
  5. <filter-mapping>  
  6.     <filter-name>myFilter</filter-name><!--和filter的名字一一對應-->  
  7.     <url-pattern>/*</url-pattern><!--比如url-pattern中為 /* ,則對于所有請求進行過濾-->             
  8. </filter-mapping> 

監聽器

監聽器顧名思義就是監聽某種事件的發生,即當某個事件發生時,就觸發了某個設定好的監聽器,但是這裡觸發的原因不同。例如地震監測儀器監聽地震的發生,大氣監測儀,監測空氣的變化以提供預警。 在servlet中因監聽對象的不同也分為不同的監聽器,這裡指的監聽對象是application、session、request對象,每種對象有各自的監聽器。 編寫完監聽器類後,需要在web.xml中做如下配置

  1. <listener>  
  2.     <listener-class>監聽器類的全路徑</listener-class>  
  3. </listener>

1.application監聽器:ServletContextListener

需要實作的方法:

(1)public void contextInitialized(ServletContextEvent e);       //在application建立時就調用

(2)public void contextDestroyed(ServletContextEvent e);        //當application銷毀時調用

ServletContextEvent的getServletContext()方法可以取得application對象;

2.application屬性監聽器:ServletContextAttributeListener

需要實作的方法:

(1)public void attributeAdded(ServletContextAttributeEvent e);            //當調用application.setAttribute()時調用

(2)public void attributeRemoved(ServletContextAttributeEvent e);        //當調用applcaition.removeAttribute()時調用

(3)public void attributeReplaced(ServletContextAttributeEvent e);        //當調用兩次application.setAttribute()賦予相同屬性時調用

參數ServletContextAttributeEvent可以獲得觸發該監聽器的屬性名稱和屬性值,方法有:

(1)getName();  取得屬性的名稱;

(2)getValue();   取得屬性的值;(注意:傳回的是Object,必須轉型)

3.session監聽器:HttpSessionListener

需要實作的方法:

(1)public void sessionCreated(HttpSessionEvent e);                //當打開一個浏覽器時,就會觸發這個方法;

(2)public void sessionDestroyed(HttpSessionEvent e);            //當調用session.invalidate();或逾時時調用

HttpSessionEvent的方法getSession()獲得觸發監聽器的session對象;  

銷毀session有3種方式:

(1)session.invalidate();//直接銷毀

(2)在web.xml中設定逾時時間://所有session起作用

  1. <session-config>  
  2.     <session-timeout>5</session-timeout>  <!-- 5分鐘 -->  
  3. </session-config>  

(3)session.setMaxInactiveInterval(秒鐘值);//給指定的session設定逾時時間

注意:如果會話逾時時間設定為-1,則表示會話永遠不會逾時;

4.session屬性監聽器:HttpSessionAttributeListener

需要實作的方法:

(1)public void attributeAdded(HttpSessionBindingEvent e);            //當調用session.setAttribute()時調用

(2)public void attributeRemoved(HttpSessionBindingEvent e);        //當調用session.removeAttribute()時調用

(3)public void attributeReplaced(HttpSessionBindingEvent e);         //當調用兩次session.setAttribute()賦予相同屬性時調用

HttpSessionBindingEvent 方法:

(1)getSession();//擷取觸發監聽器的session

(2)getName();//擷取屬性名稱

(3)getValue();//擷取屬性值

5.session屬性綁定監聽器:HttpSessionBindingListener

需要實作的方法:

(1)public void valueBound(HttpSessionBindingEvent e);                    

(2)public void valueUnbound(HttpSessionBindingEvent e);

注意:這個監聽器不用在web.xml中進行配置,而自動生效。

當實作這個接口的類被作為屬性添加如内置對象時,就會觸發valueBound;當删除這個屬性時,則會觸發valueUnbound;

比如

class A implements HttpSessionBindingListener{

    .....

    public void valueBound(HttpSessionBindingEvent e){}

    public void valueUnbound(HttpSessionBindingEvent e){}

}

當調用

session.setAttribute("a",new A())時即添加A類對象時,則會觸發valueBound方法,當調用session.removeAttribute("a")時觸發valueUnbound方法;

6.request監聽器:ServletRequestListener

需要實作的方法:

(1)public void requestInitialized(ServletRequestEvent e);        //當請求一個網頁(jsp/servlet)時會調用

(2)public void requestDestroyed(ServletRequestEvent e);       //當請求結束時會調用

ServletRequestEvent 方法:

(1)getServletContext();取得application對象;

(2)getServletRequest();  取得request對象;

7.request屬性監聽器:ServletRequestAttributeListener

需要實作的方法:

(1)attributeAdded(ServletRequestAttributeEvent e);                            //當調用request.setAttribute()時調用

(2)attributeRemoved(ServletRequestAttributeEvent e);                     //當調用request.removeAttribute()時調用

(3)attributeReplaced(ServletRequestAttributeEvent e);                     //當調用兩次request.setAttribute()賦予相同屬性時調用

ServletRequestAttributeEvent 方法:

(1)getName();//擷取屬性名

(2)getValue();//擷取屬性值

監聽器應用場景

ServletContextListener:在任何Servlet提供服務之前執行、在Servlet銷毀時執行,用于提前初始化一些資源,比如資料庫連接配接、銷毀一些資源,比如資料庫連接配接;

HttpSessionListener:多少個線上使用者,即跟蹤會話;

ServletContextAttributeListener:上下文中添加、删除、替換了屬性;

ServletRequestListener:請求到來時記錄日志;

ServletRequestAttributeListener:添加、删除、替換請求屬性;

HttpSessionBindingListener:監聽屬性類的添加、删除;

HttpSessionAttributeListener:會話屬性添加、删除、替換;

HttpSessionActivationListener:你有一個屬性類,并且希望這個類的對象在綁定會話遷移到另一個JVM中;

HttpSessionAttributeListener&HttpSessionBindingListener

HttpSessionAttributeListener:當會話中添加、删除、替換屬性時;

HttpSessionBindingListener:當屬性本身作為會話的屬性、從會話中删除時;

HttpSessionBindingListener方法:

(1)public void valueBound(HttpSessionBindingEvent event);

(2)public void valueUnbound(HttpSessionBindingEvent event);

注意:HttpSessionAttributeListener不需要在web.xml中注冊;