您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“SpringMVC攔截器創建配置及執行順序是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“SpringMVC攔截器創建配置及執行順序是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
springMVC 中的攔截器用于攔截控制器方法的執行。
先創建出前置需要的一些條件:
<a th:href="@{/testInterceptor}" rel="external nofollow" >測試攔截器</a>
后端:
@Controller public class TestController { @RequestMapping("/testInterceptor") public String testInterceptor() { return "success"; } }
新建一個包 interceptors,在下面創建一個攔截器 FirstInterceptor ,并且要實現 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
: 在當前控制器方法執行之前執行。
postHandle
: 在當前控制器方法執行之后執行。
afterCompletion
:處理完視圖和模型數據,渲染視圖完畢之后執行。
在 springMVC 配置文件里配置攔截器,對象就是FirstInterceptor
類:
<!-- 配置攔截器 --> <mvc:interceptors> <bean class="com.pingguo.mvc.interceptors.FirstInterceptor"></bean> </mvc:interceptors>
重新部署,訪問http://localhost:8080/springmvc/
,發現頁面空白,查看控制器日志看到有打印:
說明攔截成功。
看下上面重新的三個方法中,只有preHandle
有返回值,是個布爾類型:false 表示攔截,true 表示放行。
修改上面preHandle
的返回為 true,重新部署后再次訪問首頁,可以訪問成功。
查看控制臺打印輸出,看到在渲染之前,前面2個方法執行了:preHandle
、postHandle
。
在非常多的 Thymeleaf 渲染之后,最后一個 afterCompletion
也執行了。
現在繼續點擊首頁里的新加的超鏈接,發現也會被攔截放行。
說明這種配置方式,會攔截所有的請求。
可以通過 ref 或 bean 標簽設置攔截器:
通過mvc:mapping
設置需要攔截的請求通過
mvc:exclude-mapping
設置需要排除的請求
<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="/">
,表示除了首頁不攔截。
也就是說,現在我訪問http://localhost:8080/springmvc/
的時候,應該不攔截。訪問http://localhost:8080/springmvc/testInterceptor
就會攔截了。
試一下,先訪問 http://localhost:8080/springmvc/
:
可以正常打開首頁,并且控制臺也沒有輸出攔截器里的內容:
現在繼續訪問 http://localhost:8080/springmvc/testInterceptor
,
攔截了。
繼續新建一個攔截器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/
,查看控制臺打印輸出。
可以發現,preHandle 方法執行的順序是 FirstInterceptor->SecondInterceptor
。其他 2 個方法則是順序倒過來。
若每個攔截器的 preHandle()
都返回 true:
執行順序跟配置里的順序有關,在上面攔截器里 firstInterceptor
就是在 secondInterceptor
前面。
preHandle()
會按照配置的順序執行,而postHandle()和
afterComplation()`會按照配置的反序執行。
若某個攔截器的preHandle()
返回了false:
preHandle()
返回false
和它之前的攔截器的preHandle()
都會執行。
postHandle()
都不執行。
返回false
的攔截器之前的攔截器的afterComplation()
會執行。
試一下,把 SecondInterceptor
中的preHandle()
修改返回 false,再次請求下首頁:
符合預期。
讀到這里,這篇“SpringMVC攔截器創建配置及執行順序是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。