SpringMVC攔截器及多攔截器時的執行順序


本文鏈接:https://blog.csdn.net/itcats_cn/article/details/80371639
攔截器的配置步驟

springmvc.xml中配置多個攔截器
配置自定義攔截器並實現接口
<!-- 配置springmvc攔截器 -->
<mvc:interceptors>

<mvc:interceptor>
<!-- 對什么url路徑進行攔截 /**代表對全路徑攔截 -->
<mvc:mapping path="/**"/>
<!-- 注入自定義攔截器到bean標簽 -->
<bean class="cn.itcats.ssm.interception.Inteceptor1" />
</mvc:interceptor>

<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="cn.itcats.interception.Inteceptor2" />
</mvc:interceptor>

</mvc:interceptors>
 

//攔截器1

public class Inteceptor1 implements HandlerInterceptor{

//方法執行前1
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
//返回值boolean類型 決定是否放行
System.out.println("方法執行前1");
return true;
}

//方法執行后1
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
System.out.println("方法執行后1");
}

//頁面渲染后1
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
System.out.println("頁面渲染后1");
}

}
 

//攔截器2
public class Inteceptor2 implements HandlerInterceptor{

//方法執行前2
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
//返回值boolean類型 決定是否放行
System.out.println("方法執行前2");
return true;
}

//方法執行后2
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
System.out.println("方法執行后2");
}

//頁面渲染后2
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
System.out.println("頁面渲染后2");
}

}
 

SpringMVC攔截器配置后,主要對三個過程進行攔截校驗:

方法執行前(有boolean返回值,返回true則放行)【Hanler執行之前】
方法執行后【Handler執行之后,ModelAndView返回之前】
頁面渲染后【ModelAndView執行之后,對異常處理】
 

多個攔截器執行順序

    如有兩個攔截器

    (1)方法執行前返回值都為true,則順序如下

    方法執行前1   

    方法執行前2

    方法執行后2

    方法執行后1

    頁面渲染后2

    頁面渲染后1        

 

方法1和方法2是相對的,取決於springmvc自定義攔截器類配置的先后順序(這里是自定義攔截器1先於攔截器2)

總結起來: 攔截器1中的方法執行前1先執行,后執行攔截器2中的方法執行前2方法,后攔截器2的方法先於攔截器1的方法執行

 

    (2)攔截器1中方法執行前1 返回值為false,而攔截器2中方法執行前2返回值為 true 執行順序如下:

        方法執行前1    //此時被攔截,不放行

總結起來:只執行攔截器1方法執行前的方法,當攔截器1方法執行前被攔截,返回值為false不被放行,后面的攔截器鏈都不執行,無論2的返回值是true還是false

 

     (3)攔截器1中方法執行前1 返回值為true,而攔截器2中方法執行前2返回值為 false  執行順序如下:

        方法執行前1

        方法執行前2   //被攔截,不放行

        頁面渲染后1

 

總結執行順序:

preHandle按攔截器定義順序調用
postHandler按攔截器定義逆序調用
afterCompletion按攔截器定義逆序調用
postHandler在攔截器鏈內所有攔截器返成功調用
afterCompletion只有preHandle返回true才調用
 

 

如何讓兩個Interceptor有序執行呢?
如果繼承WebMvcConfigurationSupport,需要處理所有SpringMVC為我們提供的接口實現,所以我們繼承WebMvcConfigurerAdapter,我們想要Interceptor順序執行,重寫addInterceptor()方法

public void addInterceptors(InterceptorRegistry registry){
registry.addInterceptor(authInterceptor).excludePathPatterns("/static").addPathPatterns("/**");
registry
.addInterceptor(authActionInterceptor).addPathPatterns("/house/toAdd")
.addPathPatterns("/accounts/profile").addPathPatterns("/accounts/profileSubmit")
.addPathPatterns("/house/bookmarked").addPathPatterns("/house/del")
.addPathPatterns("/house/ownlist").addPathPatterns("/house/add")
.addPathPatterns("/house/toAdd").addPathPatterns("/agency/agentMsg")
.addPathPatterns("/comment/leaveComment").addPathPatterns("/comment/leaveBlogComment");
super.addInterceptors(registry);

————————————————
版權聲明:本文為CSDN博主「itcats_cn」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/itcats_cn/article/details/80371639


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM