SpringMVC中的攔截器

ning12發表於2024-06-29

目錄
  • 11、攔截器
    • 11.1書寫攔截器的步驟
      • 一、首先需要在SpringMVC.xml中配置攔截器
      • 二、處理完配置檔案進行配置類的書寫書寫的類需要實現HandlerInterceptor介面
    • 11.2多個攔截器的執行順序
      • ⑴如果每個攔截器的preHandle()都返回true
      • ⑵如果某個攔截器的preHandle()返回了false

11、攔截器

11.1書寫攔截器的步驟

一、首先需要在SpringMVC.xml中配置攔截器

<!--        配置攔截器-->
<mvc:interceptors>

    <!--        直接配置攔截器-->
    <!--        <bean class="com.qc.interceptor.FirstInterceptor"></bean>-->
    <!--        <ref bean="firstInterceptor"/>-->

    <!--        配置精確的攔截器-->
    <mvc:interceptor>
        <!--            配置攔截器的路徑-->
        <mvc:mapping path="/**"/>
        <!--            配置需要排除的路徑-->
        <mvc:exclude-mapping path="/test/abc"/>
        <mvc:exclude-mapping path="/"/>

        <ref bean="firstInterceptor"></ref>
    </mvc:interceptor>
    <!--精確配置攔截器二-->
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/test/abc"/>
        <mvc:exclude-mapping path="/"/>
        <ref bean="secondInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

上面的程式碼中提到了兩種方法配置攔截器(直接配置,精確配置),更推薦使用精確配置

二、處理完配置檔案進行配置類的書寫書寫的類需要實現HandlerInterceptor介面

SpringMVC的攔截器有三個抽象方法

  1. preHandle:控制器方法執行之前執行preHandle(),其boolean型別的返回值表示攔截或放行,返回true為放行,即可以呼叫控制方法;返回false表示攔截,即不可以呼叫控制器方法。

  2. postHandle:控制器方法執行之後執行postHandle()

  3. afterCompletion:處理萬檢視和模型資料,渲染檢視完畢之後執行

@Component
public class FirstInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("FirstInterceptor...preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("FirstInterceptor...postHandle");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("FirstInterceptor...afterCompletion");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

11.2多個攔截器的執行順序

⑴如果每個攔截器的preHandle()都返回true

此時多個攔截器的執行順序和攔截器在SpringMVC配置檔案中的配置順序有關:

preHandle()會按照配置的順序執行,而其它兩個postHandle和afterCompletion會按照配置的逆序執行

⑵如果某個攔截器的preHandle()返回了false

preHandle()返回false和它之前的攔截器的preHanlde()都會執行,postHandle()都不執行,返回false的攔截器之前的攔截器的afterCompletion會執行

相關文章