javaweb---filter、Listener、interceptor小結

一、Filter:

Servlet加強版,對用戶請求進行預處理,也可以對HttpServletResponse進行後處理,是典型的處理鏈。

 

用處:

1、  在HttpServletRequest到達servlet之前,攔截客戶的HttpServletRequest

2、  根據需要檢查HttpServletRequest,或修改HttpServletRequest頭和數據

3、  在HttpServletResponse到達客戶端之前,攔截HttpServletResponse

4、  根據需要檢查HttpServletResponse,或修改HttpServletResponse頭和數據

 

種類:

1、  用戶授權的filter

2、  日誌filter

3、  負責解碼的filter

4、  能改變XML內容的XSLTfilter

5、  filter可以負責攔截多個請求或響應,一個請求或響應也可以被多個filter攔截

 

創建一個filter的步驟

1、  創建filter處理類

public class FilterDemo01 implements Filter {

     @Override
   public void init(FilterConfig filterConfig) throws ServletException {
     }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
          dosomething;
          chain.doFilter(request, response);
     }
    @Override
    public void destroy() {
     }
}

2、  在web.xml文件中配置filter

<!--配置過濾器-->
   <filter>
      <filter-name>FilterDemo01</filter-name>
          <filter-class>me.gacl.web.filter.FilterDemo01</filter-class>
 </filter>
  
  <!--映射過濾器-->
<filter-mapping>
       <filter-name>FilterDemo01</filter-name>
      <!--“/*”表示攔截所有的請求 -->
      <url-pattern>/*</url-pattern>
  </filter-mapping>

Filter與servlet具有完全相同的生命週期行爲。


二、Listener

監聽web應用內部各種事件並做出處理

 

ServletAPI給出的常用Listener接口,自定義Listener要選擇性實現它們:

1、  ServletContextAttributeListener

2、  ServletContextListener

3、  HttpSessionListener

4、  HttpSessionAttributeListener

 

使用Listener的步驟

1、  定義Listener實現類

2、  通過註解或者web.xml文件中配置Listener

註解:@WebListener

Web.xml:

<listener>  
    <listener-class>com.ee.listener.OnlineUserListener</listener-class>  
</listener>


三、interceptor

interceptor動態攔截Action調用的對象,在service或者其他方法前後調用一個方法進行處理。採用了java動態代理和反射的機制來實現,與servlet無關。不同框架實現的攔截器內部方法是不同的。

 

實現攔截器的步驟(模塊):

l  業務組件,被代理和被攔截的對象;

l  代理處理器,實現了InvocationHandler 接口的一個對象;

l  代理對象,Proxy 對象;

l  攔截器,普通的JavaBean,在調用業務方法之前或者之後會自動攔截並執行自己的一些方法;

l  客戶端,執行業務處理的入口。

 具體見:http://blog.csdn.net/qq_35246620/article/details/68484407講得很詳細,不再贅述。


SpringMVC的攔截器基本結構:

package org.springframework.web.servlet;  
public interface HandlerInterceptor {  
    boolean preHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler)   
            throws Exception;  
  
    void postHandle(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, ModelAndView modelAndView)   
            throws Exception;  
  
    void afterCompletion(  
            HttpServletRequest request, HttpServletResponse response,   
            Object handler, Exception ex)  
            throws Exception;  
}   


 

四、過濾器(filter)和攔截器(interceptor)區別:http://jay-zhong.iteye.com/blog/1511919

1、filter基於filter接口中的doFilter回調函數,interceptor則基於Java本身的反射機制;

2、filter是依賴於servlet容器的,沒有servlet容器就無法回調doFilter方法,而interceptor與servlet無關;

3、filter的過濾範圍比interceptor大,filter除了過濾請求外通過通配符可以保護頁面、圖片、文件等,而interceptor只能過濾請求,只對action起作用,在action之前開始,在action完成後結束(如被攔截,不執行action);

4、filter的過濾一般在加載的時候在init方法聲明,而interceptor可以通過在xml聲明是guest請求還是user請求來辨別是否過濾;

5、interceptor可以訪問action上下文、值棧裏的對象,而filter不能;

6、在action的生命週期中,攔截器可以被多次調用,而過濾器只能在容器初始化時被調用一次。





發佈了20 篇原創文章 · 獲贊 24 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章