SpringMVC攔截器創(chuàng)建配置及執(zhí)行順序
SpringMVC攔截器介紹
springMVC 中的攔截器用于攔截控制器方法的執(zhí)行。
先創(chuàng)建出前置需要的一些條件:
<a th:href="@{/testInterceptor}" rel="external nofollow" >測試攔截器</a>后端:
@Controller
public class TestController {
@RequestMapping("/testInterceptor")
public String testInterceptor() {
return "success";
}
}一、創(chuàng)建攔截器
新建一個包 interceptors,在下面創(chuàng)建一個攔截器 FirstInterceptor ,并且要實現(xiàn) HandlerInterceptor 接口。

快捷鍵Ctrl + O,快速重寫方法,圖示里的 3 個。
public class FirstInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor --> preHandle");
return false;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("FirstInterceptor --> postHandle");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("FirstInterceptor --> afterCompletion");
}
}preHandle: 在當(dāng)前控制器方法執(zhí)行之前執(zhí)行。
postHandle: 在當(dāng)前控制器方法執(zhí)行之后執(zhí)行。
afterCompletion:處理完視圖和模型數(shù)據(jù),渲染視圖完畢之后執(zhí)行。
二、配置攔截器
在 springMVC 配置文件里配置攔截器,對象就是FirstInterceptor 類:
<!-- 配置攔截器 -->
<mvc:interceptors>
<bean class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean>
</mvc:interceptors>重新部署,訪問http://localhost:8080/springmvc/,發(fā)現(xiàn)頁面空白,查看控制器日志看到有打?。?/p>

說明攔截成功。
看下上面重新的三個方法中,只有preHandle有返回值,是個布爾類型:false 表示攔截,true 表示放行。
修改上面preHandle的返回為 true,重新部署后再次訪問首頁,可以訪問成功。

查看控制臺打印輸出,看到在渲染之前,前面2個方法執(zhí)行了:preHandle、postHandle 。

在非常多的 Thymeleaf 渲染之后,最后一個 afterCompletion 也執(zhí)行了。

現(xiàn)在繼續(xù)點擊首頁里的新加的超鏈接,發(fā)現(xiàn)也會被攔截放行。

說明這種配置方式,會攔截所有的請求。
設(shè)置不需要攔截的請求
可以通過 ref 或 bean 標(biāo)簽設(shè)置攔截器:
- 通過mvc:mapping設(shè)置需要攔截的請求通過
- mvc:exclude-mapping設(shè)置需要排除的請求
<bean name="firstInterceptor" class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean>
<!-- 配置攔截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/"></mvc:exclude-mapping>
<ref bean="firstInterceptor"></ref>
</mvc:interceptor>
</mvc:interceptors>注意這里我在外部注冊了一個 bean 叫 firstInterceptor,以便 ref 引用。
- <mvc:mapping path="/**"/>,表示攔截所有請求。
- <mvc:exclude-mapping path="/">,表示除了首頁不攔截。
也就是說,現(xiàn)在我訪問http://localhost:8080/springmvc/的時候,應(yīng)該不攔截。
訪問http://localhost:8080/springmvc/testInterceptor就會攔截了。
試一下,先訪問 http://localhost:8080/springmvc/:
可以正常打開首頁,并且控制臺也沒有輸出攔截器里的內(nèi)容:

現(xiàn)在繼續(xù)訪問 http://localhost:8080/springmvc/testInterceptor,

攔截了。
三、多個攔截器的執(zhí)行順序
繼續(xù)新建一個攔截器SecondInterceptor,注意這次我加了 @Component,方便在配置文件中直接ref引用使用。
@Component
public class SecondInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("SecondInterceptor --> preHandle");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("SecondInterceptor --> postHandle");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("SecondInterceptor --> afterCompletion");
}
}修改攔截器配置:
<!-- 配置攔截器 -->
<mvc:interceptors>
<ref bean="firstInterceptor"></ref>
<ref bean="secondInterceptor"></ref>
</mvc:interceptors>重新部署,訪問下首頁http://localhost:8080/springmvc/,查看控制臺打印輸出。

可以發(fā)現(xiàn),preHandle 方法執(zhí)行的順序是 FirstInterceptor->SecondInterceptor。其他 2 個方法則是順序倒過來。
若每個攔截器的 preHandle()都返回 true:
- 執(zhí)行順序跟配置里的順序有關(guān),在上面攔截器里 firstInterceptor 就是在 secondInterceptor前面。
- preHandle()會按照配置的順序執(zhí)行,而postHandle()和afterComplation()`會按照配置的反序執(zhí)行。
若某個攔截器的preHandle()返回了false:
- preHandle()返回false和它之前的攔截器的preHandle()都會執(zhí)行。
- postHandle()都不執(zhí)行。
- 返回false的攔截器之前的攔截器的afterComplation()會執(zhí)行。
試一下,把 SecondInterceptor 中的preHandle()修改返回 false,再次請求下首頁:

符合預(yù)期。
這些過程可以打斷點看下源碼的執(zhí)行過程。
以上就是SpringMVC攔截器創(chuàng)建配置及執(zhí)行順序的詳細內(nèi)容,更多關(guān)于SpringMVC攔截器配置的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java使用DateFormatter格式化日期時間的方法示例
這篇文章主要介紹了Java使用DateFormatter格式化日期時間的方法,結(jié)合具體實例分析了java使用DateFormatter格式化日期時間的相關(guān)操作技巧,需要的朋友可以參考下2017-04-04
Mybatis基于xml配置實現(xiàn)單表的增刪改查功能
這篇文章主要介紹了Mybatis基于xml配置實現(xiàn)單表的增刪改查,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04
SpringBoot實現(xiàn)統(tǒng)一功能處理的教程詳解
這篇文章主要為大家詳細介紹了SpringBoot如何實現(xiàn)統(tǒng)一功能處理,文中的示例代碼講解詳細,對大家學(xué)習(xí)或工作有一定借鑒價值,感興趣的同學(xué)可以參考閱讀下2023-05-05

