過(guò)濾器和攔截器的區(qū)別有哪些

這篇文章主要講解了“過(guò)濾器和攔截器的區(qū)別有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“過(guò)濾器和攔截器的區(qū)別有哪些”吧!

成都創(chuàng)新互聯(lián)公司-成都網(wǎng)站建設(shè)公司,專(zhuān)注成都做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷(xiāo)推廣,域名注冊(cè),網(wǎng)站空間,網(wǎng)站托管有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問(wèn)題,請(qǐng)聯(lián)系成都創(chuàng)新互聯(lián)公司。

Filter的使用

首先,要使用Filter,必須實(shí)現(xiàn)javax.servlet.Filter接口:

public interface Filter {     //web應(yīng)用加載進(jìn)容器,F(xiàn)ilter對(duì)象創(chuàng)建之后,執(zhí)行init方法初始化,用于加載資源,只執(zhí)行一次。      public default void init(FilterConfig filterConfig) throws ServletException {}     //每次請(qǐng)求或響應(yīng)被攔截時(shí)執(zhí)行,可執(zhí)行多次。     public void doFilter(ServletRequest request, ServletResponse response,             FilterChain chain) throws IOException, ServletException;     //web應(yīng)用移除容器,服務(wù)器被正常關(guān)閉,則執(zhí)行destroy方法,用于釋放資源,只執(zhí)行一次。     public default void destroy() {} }
  • init和destroy是default方法,實(shí)現(xiàn)類(lèi)可以不用實(shí)現(xiàn)。

  • doFilter必須實(shí)現(xiàn),也就是說(shuō),作為一個(gè)過(guò)濾器,doFilter必須要定義。

  • doFlilter方法中傳進(jìn)來(lái)的FilterChain對(duì)象用來(lái)調(diào)用下一個(gè)過(guò)濾器。

攔截器的使用

public interface HandlerInterceptor {     //攔截handler的執(zhí)行 --> 在HanlerMapping決定適合的handler之后,[在HandlerAdater調(diào)用handler之前執(zhí)行。]     default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)             throws Exception {      return true;     }   //攔截handler的執(zhí)行 --> [在HandlerAdapter調(diào)用handler之后],在DispatcherServlet渲染視圖之前執(zhí)行     default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,             @Nullable ModelAndView modelAndView) throws Exception { }   //視圖渲染后調(diào)用,且只有preHandle結(jié)果為true,才會(huì)調(diào)用     default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,             @Nullable Exception ex) throws Exception {  }}  //DispatcherServlet if (!mappedHandler.applyPreHandle(processedRequest, response)) {     return; //遍歷所有的interceptors,調(diào)用preHandle方法,只有返回true,才能進(jìn)行下去 } // 這里也就是處理Contrller mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); //視圖渲染 applyDefaultViewName(processedRequest, mv); //視圖渲染之后調(diào)用 mappedHandler.applyPostHandle(processedRequest, response, mv);

過(guò)濾器與攔截器到底有啥區(qū)別呢?

一、實(shí)現(xiàn)原理不同

過(guò)濾器的實(shí)現(xiàn)基于回調(diào)函數(shù)

攔截器基于Java的反射機(jī)制【動(dòng)態(tài)代理】實(shí)現(xiàn)。

二、使用范圍不同

過(guò)濾器是Servlet的規(guī)范,需要實(shí)現(xiàn)javax.servlet.Filter接口,F(xiàn)ilter使用需要依賴(lài)于Tomcat等容器。

攔截器是Spring組件,定義在org.springframework.web.servlet包下,由Spring容器管理【又有更加豐富的生繆那個(gè)周期處理方法,細(xì)粒度,且能夠使用Spring中的資源】,不依賴(lài)Tomcat等容器。

三、觸發(fā)時(shí)機(jī)不同

這一段在HandlerInterceptor類(lèi)的注釋上可以發(fā)現(xiàn),兩者的觸發(fā)時(shí)機(jī)是不同的:

過(guò)濾器和攔截器的區(qū)別有哪些
  • 過(guò)濾器:對(duì)請(qǐng)求在進(jìn)入后Servlet之前或之后進(jìn)行處理。

  • 攔截器:對(duì)請(qǐng)求在handler【Controller】前后進(jìn)行處理。

過(guò)濾器和攔截器的區(qū)別有哪些

四、執(zhí)行順序不同

同時(shí)配置了過(guò)濾器和攔截器的情形:

MyFilter1 前 MyFilter2 前 MyInterceptor1 在Controller前執(zhí)行 MyInterceptor2 在Controller前執(zhí)行 controller方法執(zhí)行... MyInterceptor2 Controller之后,視圖渲染之前 MyInterceptor1 Controller之后,視圖渲染之前 MyInterceptor2 視圖渲染完成之后執(zhí)行 MyInterceptor1 視圖渲染完成之后執(zhí)行 MyFilter2 后 MyFilter1 后

過(guò)濾器的順序

每一次都將chain對(duì)象傳入,達(dá)到最后接口回調(diào)的效果:

過(guò)濾器和攔截器的區(qū)別有哪些

攔截器的順序

preHandle1 -> preHande2 -> 【Controller】 -> postHandle2 ->  postHandle1 -> afterCompletion2 ->  afterComplention1preHandle按照注冊(cè)順序,后兩個(gè)與注冊(cè)順序相反。

  • 一個(gè)攔截器的preHandle為false,則之后的所有攔截器都不會(huì)執(zhí)行。

  • 一個(gè)攔截器的preHandle為true,則這個(gè)攔截器的triggerAfterCompletion一定會(huì)執(zhí)行。

  • 只有所有的攔截器preHandler都為true,也就是正常執(zhí)行,postHandle才會(huì)執(zhí)行。

boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {     HandlerInterceptor[] interceptors = getInterceptors();    if (!ObjectUtils.isEmpty(interceptors)) {         for (int i = 0; i < interceptors.length; i++) {             HandlerInterceptor interceptor = interceptors[i];            //一旦當(dāng)前攔截器preHandle的返回值為false,那么從上一個(gè)可用的攔截器的afterCompletion開(kāi)始             if (!interceptor.preHandle(request, response, this.handler)) {                 triggerAfterCompletion(request, response, null);                 return false; //這里返回false意為 后續(xù)不進(jìn)行下去了。             }            this.interceptorIndex = i;//interceptorIndex初始化為-1,只有當(dāng)前攔截器preHandle為true,才會(huì)賦值當(dāng)前的i。         }    }    return true; }void applyPostHandle(HttpServletRequest request, HttpServletResponse response, @Nullable ModelAndView mv)    throws Exception {    HandlerInterceptor[] interceptors = getInterceptors();    if (!ObjectUtils.isEmpty(interceptors)) {         for (int i = interceptors.length - 1; i >= 0; i--) {             HandlerInterceptor interceptor = interceptors[i];            interceptor.postHandle(request, response, this.handler, mv);         }    }}void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, @Nullable Exception ex)    throws Exception {    HandlerInterceptor[] interceptors = getInterceptors();        for (int i = this.interceptorIndex; i >= 0; i--)  }

五、控制執(zhí)行順序方式不同

兩者默認(rèn)都是使用注冊(cè)順序,如果想要認(rèn)為控制執(zhí)行的順序,方式略有不同:

  • 過(guò)濾器如果想要強(qiáng)制改變,可以使用@Order注解。

  • 攔截器如果使用order()方法

@Order(2) @Component public class MyFilter1 implements Filter {}  @Component public class WebAdapter implements WebMvcConfigurer {     @Autowired     MyInterceptor1 myInterceptor1;    @Autowired     MyInterceptor2 myInterceptor2;    @Override     public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(myInterceptor1).addPathPatterns("/**").order(2);         registry.addInterceptor(myInterceptor2).addPathPatterns("/**").order(1);     }}

感謝各位的閱讀,以上就是“過(guò)濾器和攔截器的區(qū)別有哪些”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)過(guò)濾器和攔截器的區(qū)別有哪些這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享文章:過(guò)濾器和攔截器的區(qū)別有哪些
文章轉(zhuǎn)載:http://bm7419.com/article38/gocosp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、響應(yīng)式網(wǎng)站建站公司、網(wǎng)站收錄定制網(wǎng)站、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化