Spring MVC攔截器的基本使用方法
攔截器簡介
Spring MVC 中的攔截器(Interceptor)類似于 Servler 中的過濾器(Filter)。用于對處理器進(jìn)行預(yù)處理和后處理。常用于日志記錄、權(quán)限管理、性能監(jiān)控、通用行為等。
攔截器的實現(xiàn)
Spring MVC 中的攔截器需要我們手動實現(xiàn)和配置。攔截器可以通過以下兩種方式定義
- 實現(xiàn) HandleInterceptor 接口,或者繼承該接口的實現(xiàn)類如 HandleInterceptorAdapter 來定義一個攔截器;
- 實現(xiàn) WebRequestInterceptor 接口來定義一個攔截器;
HandleInterceptor 接口
我們主要講解下實現(xiàn) HandleInterceptor 接口來創(chuàng)建攔截器。HandleInterceptor 接口定義了三個方法,分別為 preHandle() , postHandle() , afterCompletion(),我們需要重寫這三個方法,從而來實現(xiàn)我們定義攔截器的目的。
- preHandle(HttpServletRequest request, HttpServletResponse response, Object handle):該方法在請求處理前調(diào)用。Spring MVC 中的攔截器是鏈?zhǔn)秸{(diào)用的,一個請求可以被多個攔截器攔截,但是 Interceptor 會根據(jù)被聲明的次序依次被調(diào)用執(zhí)行,而不會同時去攔截。而且所有 Interceptor 中的 preHandle 函數(shù)都會最先被調(diào)用,所以這個方法中可以進(jìn)行一些前置初始化操作或者是對當(dāng)前請求的預(yù)處理,或者設(shè)置一些判斷來決定該請求是否執(zhí)行下去。該方法的返回值是布爾值,當(dāng)它返回 true 時,之后的 Interceptor 和 controller 都不會執(zhí)行下去了;當(dāng)它返回 false 時,就會繼續(xù)調(diào)用下一個 Interceptor 的 preHandle 方法或者處理當(dāng)前請求的 Controller。
- postHandle(HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView):該方法只有在 perHandle 方法返回值為 true 時,在 Controller 執(zhí)行完當(dāng)前請求后才會執(zhí)行。咋一看好像和之后要介紹的 afterCompletion 方法沒有不同,但是這個方法會在 DispatcherServlet 進(jìn)行視圖渲染之前被調(diào)用,所以咱們可以在這個方法中對 Controller 處理之后的 ModelAndView 對象進(jìn)行操作。
- afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex):該方法在整個請求結(jié)束后,也就是 DispatcherServlet 渲染了對應(yīng)視圖之后執(zhí)行,這個方法的主要作用是用于進(jìn)行資源清理的工作。
假設(shè)我們現(xiàn)在定義了兩個攔截器,xml 配置文件中配置順序如下內(nèi)容如下:
<!-- 攔截器1 --> <mvc:interceptor> <!--配置攔截器的作用路徑--> <mvc:mapping path="/**"/> <bean class="com.jojo.test.interceptor.Intercptor1"/> </mvc:interceptor> <!--攔截器2--> <mvc:interceptor> <mvc:mapping path="/hello"/> <bean class="com.jojo.test.interceptor.Interceptor2"/> </mvc:interceptor>
那么這兩個攔截器中的處理方法和請求的處理方法的順序如下圖:

實際應(yīng)用舉例
實現(xiàn)開發(fā)中,我們會要求一些頁面需要登錄后才能訪問。未登錄狀態(tài)是無法得到訪問權(quán)限的。這一小功能我們可以直接通過安全框架,類似 Spring Security 或者 shiro 來實現(xiàn),不過我們現(xiàn)在利用 Spring MVC 這一功能來實現(xiàn)一下:
public class LoginInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
User user = (User) httpServletRequest.getSession().getAttribute("user");
if (user == null) {
// 用戶未登錄,重定向到登錄頁
httpServletResponse.sendRedirect("/login");
return false;
}
return true;
}
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
}
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
我們還需要在 spring-mvc 中配置攔截器
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/static/**"/> <mvc:exclude-mapping path="/login"/> <bean class="com.jojo.test.interceptor.LoginInterceptor"/> </mvc:interceptor> </mvc:interceptors>
相關(guān)配置說明:
- mvc:interceptor:定義一個攔截器
- mvc:mapping:定義需要被攔截的路徑
- mvc:exclude-mapping:定義需要排除攔截的請求路徑
- bean class:指定攔截器對象
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
Java設(shè)計模式以虹貓藍(lán)兔的故事講解代理模式
代理模式是Java常見的設(shè)計模式之一。所謂代理模式是指客戶端并不直接調(diào)用實際的對象,而是通過調(diào)用代理,來間接的調(diào)用實際的對象2022-04-04
一文徹底吃透SpringMVC中的轉(zhuǎn)發(fā)和重定向
大家應(yīng)該都知道springmvc本來就會把返回的字符串作為視圖名解析,然后轉(zhuǎn)發(fā)到對應(yīng)的視圖,這篇文章主要給大家介紹了關(guān)于SpringMVC中轉(zhuǎn)發(fā)和重定向的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
深入了解Spring中最常用的11個擴(kuò)展點(diǎn)
我們一說到spring,可能第一個想到的是?IOC(控制反轉(zhuǎn))?和?AOP(面向切面編程)。除此之外,我們在使用spring的過程中,有沒有發(fā)現(xiàn)它的擴(kuò)展能力非常強(qiáng)。今天就來跟大家一起聊聊,在Spring中最常用的11個擴(kuò)展點(diǎn)2022-09-09
Java中finally關(guān)鍵字對返回值的影響詳解
這篇文章主要介紹了Java中finally關(guān)鍵字對返回值的影響詳解,執(zhí)行完try catch里面內(nèi)容準(zhǔn)備return時,如果還有finally需要執(zhí)行這是編譯器會為我們增加一個全局變量去暫存return 的值,等到finally執(zhí)行完成去return這個全局變量,需要的朋友可以參考下2024-01-01
SpringBoot中的配置類(@Configuration)
這篇文章主要介紹了SpringBoot中的配置類(@Configuration),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06

