Spring中過濾器(Filter)和攔截器(Interceptor)的區(qū)別和聯(lián)系解析
在我們?nèi)粘5拈_發(fā)中,我們經(jīng)常會用到Filter和Interceptor。有時同一個功能。Filter可以做,Interceptor也可以做。有時就需要考慮使用哪一個比較好。這篇文章主要介紹一下,二者的區(qū)別和聯(lián)系。希望給大家進行選擇的時候,提供一些幫助
Filter 和 Interceptor 的區(qū)別
Filter
過濾器(Filter)是在請求進入Tomcat容器之后,請求進入Servlet之前執(zhí)行。Filter是Servlet規(guī)范規(guī)定的,只能用于web程序中。
Interceptor
攔截器(Interceptor)是在Servlet和Controller控制器之間執(zhí)行。Interceptor是SpringframeWork中規(guī)定的。

- Interceptor是基于java的反射機制的,而Filter是基于函數(shù)回調(diào)。
- Interceptor不依賴與servlet容器,F(xiàn)ilter依賴與servlet容器。
- Interceptor只能對action請求起作用,而Filter則可以對幾乎所有的請求起作用。
- Interceptor可以訪問action上下文、值棧里的對象,而Filter不能訪問。
- Interceptor以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調(diào)用業(yè)務邏輯。攔截器可以獲取ioc中的service bean實現(xiàn)業(yè)務邏輯。
Spring MVC中每個控制器中可以定義多個請求處理方法,我們把這種請求處理方法簡稱為Action
Filter的實現(xiàn)
自己的filter需要要實現(xiàn)javax.servlet.Filter.
import javax.servlet.*;
import java.io.IOException;
public class Myfilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Myfilter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Myfilter doFilter before");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("Myfilter doFilter after");
}
@Override
public void destroy() {
System.out.println("Myfilter destroy");
}
}
注冊Filter在web.xml中
<!-- 注冊過濾器 -->
<filter>
<filter-name>myfilter</filter-name>
<filter-class>com.hardy.config.Myfilter</filter-class>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Interceptor的實現(xiàn)
自己的Interceptor需要要實現(xiàn)org.springframework.web.servlet.HandlerInterceptor.
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 在攔截點(Controller方法處理之前)執(zhí)行攔截 若返回的是false則中斷執(zhí)行 反之亦然
System.out.println("MyInterceptor preHandle");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 在處理過程中(Controller方法處理完之后 DispatcherServlet進行視圖的渲染之前)執(zhí)行攔截
System.out.println("MyInterceptor postHandle");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 在DispatcherServlet進行視圖的渲染后 返回前進行攔截
System.out.println("MyInterceptor afterCompletion");
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
注冊Interceptor在spring的配置文件中(application.xml)
<!-- 配置攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 攔截所有的mvc控制器(Controller) -->
<mvc:mapping path="/**"/>
<!-- 放行機制 指定對某個頁面不進行攔截 -->
<!-- 攔截器只對action起作用 因此填入的不是頁面路徑 而是方法 -->
<mvc:exclude-mapping path="/login"/>
<!-- 指定使用哪個攔截器 -->
<bean class="com.hardy.config.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>到此這篇關于Spring中過濾器(Filter)和攔截器(Interceptor)的區(qū)別和聯(lián)系的文章就介紹到這了,更多相關Spring過濾器和攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用mybatis-plus分頁出現(xiàn)兩個Limit的問題解決
在使用MyBatis-Plus進行分頁查詢時,可能會遇到查詢SQL中出現(xiàn)兩個limit語句的問題,這通常是由于在多個模塊中重復引入了MyBatis-Plus的分頁插件所導致的,下面就來介紹一下如何解決,感興趣的可以了解一下2024-10-10
Java編程中靜態(tài)內(nèi)部類與同步類的寫法示例
這篇文章主要介紹了Java編程中靜態(tài)內(nèi)部類與同步類的寫法示例,用于構(gòu)建靜態(tài)對象以及實現(xiàn)線程同步等,需要的朋友可以參考下2015-09-09
Springboot+Mybatis中typeAliasesPackage正則掃描實現(xiàn)方式
這篇文章主要介紹了Springboot+Mybatis中typeAliasesPackage正則掃描實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07

