Spring中過(guò)濾器(Filter)和攔截器(Interceptor)的區(qū)別和聯(lián)系解析
在我們?nèi)粘5拈_發(fā)中,我們經(jīng)常會(huì)用到Filter和Interceptor。有時(shí)同一個(gè)功能。Filter可以做,Interceptor也可以做。有時(shí)就需要考慮使用哪一個(gè)比較好。這篇文章主要介紹一下,二者的區(qū)別和聯(lián)系。希望給大家進(jìn)行選擇的時(shí)候,提供一些幫助
Filter 和 Interceptor 的區(qū)別
Filter
過(guò)濾器(Filter)是在請(qǐng)求進(jìn)入Tomcat容器之后,請(qǐng)求進(jìn)入Servlet之前執(zhí)行。Filter是Servlet規(guī)范規(guī)定的,只能用于web程序中。
Interceptor
攔截器(Interceptor)是在Servlet和Controller控制器之間執(zhí)行。Interceptor是SpringframeWork中規(guī)定的。
- Interceptor是基于java的反射機(jī)制的,而Filter是基于函數(shù)回調(diào)。
- Interceptor不依賴與servlet容器,F(xiàn)ilter依賴與servlet容器。
- Interceptor只能對(duì)action請(qǐng)求起作用,而Filter則可以對(duì)幾乎所有的請(qǐng)求起作用。
- Interceptor可以訪問(wèn)action上下文、值棧里的對(duì)象,而Filter不能訪問(wèn)。
- Interceptor以獲取IOC容器中的各個(gè)bean,而過(guò)濾器就不行,這點(diǎn)很重要,在攔截器里注入一個(gè)service,可以調(diào)用業(yè)務(wù)邏輯。攔截器可以獲取ioc中的service bean實(shí)現(xiàn)業(yè)務(wù)邏輯。
Spring MVC中每個(gè)控制器中可以定義多個(gè)請(qǐng)求處理方法,我們把這種請(qǐng)求處理方法簡(jiǎn)稱為Action
Filter的實(shí)現(xiàn)
自己的filter
需要要實(shí)現(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"); } }
注冊(cè)Filter在web.xml中
<!-- 注冊(cè)過(guò)濾器 --> <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的實(shí)現(xiàn)
自己的Interceptor
需要要實(shí)現(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 { // 在攔截點(diǎn)(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 { // 在處理過(guò)程中(Controller方法處理完之后 DispatcherServlet進(jìn)行視圖的渲染之前)執(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進(jìn)行視圖的渲染后 返回前進(jìn)行攔截 System.out.println("MyInterceptor afterCompletion"); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
注冊(cè)Interceptor在spring的配置文件中(application.xml)
<!-- 配置攔截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 攔截所有的mvc控制器(Controller) --> <mvc:mapping path="/**"/> <!-- 放行機(jī)制 指定對(duì)某個(gè)頁(yè)面不進(jìn)行攔截 --> <!-- 攔截器只對(duì)action起作用 因此填入的不是頁(yè)面路徑 而是方法 --> <mvc:exclude-mapping path="/login"/> <!-- 指定使用哪個(gè)攔截器 --> <bean class="com.hardy.config.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors>
到此這篇關(guān)于Spring中過(guò)濾器(Filter)和攔截器(Interceptor)的區(qū)別和聯(lián)系的文章就介紹到這了,更多相關(guān)Spring過(guò)濾器和攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JProfiler11使用教程之JVM調(diào)優(yōu)問(wèn)題小結(jié)
這篇文章主要介紹了JProfiler11使用教程之JVM調(diào)優(yōu),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03java使用lambda表達(dá)式對(duì)List集合進(jìn)行操作技巧(JDK1.8)
這篇文章主要介紹了java使用lambda表達(dá)式對(duì)List集合進(jìn)行操作技巧適用jdk1.8,感興趣的朋友跟著小編一起看看實(shí)現(xiàn)代碼吧2018-06-06springAOP完整實(shí)現(xiàn)過(guò)程
當(dāng)你調(diào)用SimpleService類的doSomething方法時(shí),上述的PerformanceAspect會(huì)自動(dòng)攔截此調(diào)用,并且記錄該方法的執(zhí)行時(shí)間,這樣你就完成了一個(gè)針對(duì)Spring的AOP入門級(jí)案例,感興趣的朋友一起看看吧2024-02-02Java使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列和棧流程詳解
這篇文章主要介紹了Java使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)隊(duì)列和棧流程,連續(xù)結(jié)構(gòu)和跳轉(zhuǎn)結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)中常見的兩種基本數(shù)據(jù)結(jié)構(gòu),而我們本次的主角棧和隊(duì)列都 既可以使用使用跳轉(zhuǎn)結(jié)構(gòu)實(shí)現(xiàn)也可以使用連續(xù)結(jié)構(gòu)實(shí)現(xiàn)2023-04-04druid ParserException類錯(cuò)誤問(wèn)題及解決
這篇文章主要介紹了druid ParserException類錯(cuò)誤問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Java實(shí)現(xiàn)經(jīng)典游戲打磚塊游戲的示例代碼
這篇文章主要介紹了如何利用Java實(shí)現(xiàn)經(jīng)典的游戲—打磚塊。玩家操作一根螢?zāi)簧纤降摹鞍糇印保屢活w不斷彈來(lái)彈去的“球”在撞擊作為過(guò)關(guān)目標(biāo)消去的“磚塊”的途中不會(huì)落到螢?zāi)坏紫?。感興趣的小伙伴可以了解一下2022-02-02SpringBoot 分布式驗(yàn)證碼登錄方案示例詳解
為了防止驗(yàn)證系統(tǒng)被暴力破解,很多系統(tǒng)都增加了驗(yàn)證碼效驗(yàn),比較常見的就是圖片二維碼,業(yè)內(nèi)比較安全的是短信驗(yàn)證碼,當(dāng)然還有一些拼圖驗(yàn)證碼,加入人工智能的二維碼等等,我們今天的主題就是前后端分離的圖片二維碼登錄方案,感興趣的朋友一起看看吧2023-10-10