Java 過濾器、攔截器
============================================================
一、過濾器
Filter稱之爲過濾器,Servlet提供,WEB開發人員通過Filter技術,對web服務器管理的所有web資源:
例如Jsp, Servlet, 靜態圖片文件或靜態html文件等進行攔截,從而實現一些特殊的功能。
例如實現URL級別的權限訪問控制、過濾敏感詞彙、壓縮響應信息等一些功能。
在應用啓動的時候就進行裝載Filter類,容器創建好Filter對象實例後,調用init()方法,
當應用服務被停止或重新裝載了,則會執行Filter的destroy方法,Filter對象銷燬。
1、實現:
> 新建一個類,實現Filter接口,實現doFilter()方法,
> 在web.xml中進行配置
public class Demo1Filter implements Filter {
private FilterConfig filterConfig;
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Demo1過濾前");
System.out.println(filterConfig.getInitParameter("param1"));
chain.doFilter(request, response);//放行,讓其走到下個鏈或目標資源中
System.out.println("Demo1過濾後");
}
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化了");
this.filterConfig = filterConfig;
}
public void destroy() {
System.out.println("銷燬了");
}
}
<filter>
<filter-name>Demo1Filter</filter-name>
<filter-class>com.itheima.filter.Demo1Filter</filter-class>
<init-param>
<param-name>param1</param-name>
<param-value>value在這裏呢</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Demo1Filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher> <!-- 沒有配置dispatcher就是默認request方式的 -->
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
2、作用:1> 通過控制對chain.doFilter的方法的調用,來決定是否需要訪問目標資源。
比如,可以在用戶權限驗證等等。判斷用戶是否有訪問某些資源的權限,有權限放行,沒權限不執行chain.doFilter方法。
2> 通過在調用chain.doFilter方法之前,做些處理來達到某些目的。
比如,解決中文亂碼的問題等等。可以在doFilter方法前,執行設置請求編碼與響應的編碼。
3> 通過在調用chain.doFilter方法之後,做些處理來達到某些目的。
比如對整個web網站進行壓縮。在調用chain.doFilter方法之後,通過response獲取ByteArrayOutputStream流,用GZIPOutputStream流進行壓縮下。
二、攔截器
1、實現:
servlet-context.xml中配置
<mvc:interceptors>
<!-- 使用bean定義一個Interceptor,直接定義在mvc:interceptors根下面的Interceptor將攔截所有的請求 -->
<bean class="com.host.app.web.interceptor.AllInterceptor"/>
<mvc:interceptor>
<mvc:exclude-mapping path="/login.htm"/>
<mvc:mapping path="/test/number.do"/>
<!-- 定義在mvc:interceptor下面的表示是對特定的請求才進行攔截的 -->
<bean class="com.web.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
2、作用:
攔截所有或者某一類(例如:/user/*.do)請求,作用於action方法
三、過濾器與攔截器的區別
①攔截器是基於Java的反射機制的,而過濾器是基於函數回調。
②攔截器不依賴與servlet容器,過濾器依賴於servlet容器。
③攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。
④攔截器可以訪問action上下文、值棧裏的對象,而過濾器不能訪問。
⑤在action的生命週期中,攔截器可以多次被調用,而過濾器只能在容器初始化時被調用一次。
⑥攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器裏注入一個service,可以調用業務邏輯。
Servlet的過濾器/Spring(SpringMvc)的攔截器
攔截器是被包裹在過濾器之中的。
參考:
http://www.open-open.com/lib/view/open1350703788524.html
http://blog.csdn.net/chenleixing/article/details/44573495