一、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
註解:@WebListenerWeb.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的生命週期中,攔截器可以被多次調用,而過濾器只能在容器初始化時被調用一次。