Spring中的攔截器HandlerInterceptor詳細(xì)解析
HandlerInterceptor攔截器接口
HandlerInterceptor是 Spring 框架提供的一個攔截器接口,用于在請求處理過程中攔截和處理請求。
當(dāng)一個請求到達(dá) Spring MVC 的控制器之前或之后,攔截器可以對請求進(jìn)行預(yù)處理、后處理或者進(jìn)行攔截操作。
通過實(shí)現(xiàn)HandlerInterceptor接口,可以自定義攔截器并注冊到 Spring MVC 的攔截器鏈中。
攔截器可以用于實(shí)現(xiàn)一些通用的功能,如權(quán)限驗(yàn)證、日志記錄、跨域處理等,以及對請求進(jìn)行修改、重定向或攔截等操作。
HandlerInterceptor接口定義了三個方法,分別是:
- preHandle:在請求處理之前被調(diào)用??梢赃M(jìn)行一些預(yù)處理操作,如身份驗(yàn)證、參數(shù)校驗(yàn)等。如果返回true,則繼續(xù)執(zhí)行后續(xù)的攔截器或請求處理器;如果返回false,則中斷請求處理流程。
- postHandle:在請求處理之后、視圖渲染之前被調(diào)用??梢詫φ埱蟮慕Y(jié)果進(jìn)行后處理,如添加額外的模型數(shù)據(jù)或修改視圖等。
- afterCompletion:在整個請求處理完成后被調(diào)用,即在視圖渲染完成后調(diào)用??梢赃M(jìn)行一些資源清理操作或日志記錄等。
通過實(shí)現(xiàn)HandlerInterceptor接口,并在配置文件中進(jìn)行注冊,可以將自定義的攔截器應(yīng)用到 Spring MVC 的請求處理流程中。
攔截器按照配置的順序依次執(zhí)行,并可以對請求進(jìn)行攔截、修改或處理,實(shí)現(xiàn)特定的業(yè)務(wù)邏輯或功能需求。
攔截器預(yù)處理操作
這里拿前置攔截器來說
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在此處編寫攔截處理邏輯 // ... return true; // 或者根據(jù)需要返回 false 中斷請求處理流程 }
該方法在請求到達(dá)控制器之前被調(diào)用,允許進(jìn)行一些預(yù)處理操作。
它接收三個參數(shù):
- HttpServletRequest request:表示當(dāng)前的 HTTP 請求對象,可以通過該對象獲取請求的相關(guān)信息,如請求頭、請求參數(shù)等。
- HttpServletResponse response:表示當(dāng)前的 HTTP 響應(yīng)對象,可以通過該對象操作響應(yīng),如設(shè)置響應(yīng)頭、寫入響應(yīng)內(nèi)容等。
- Object handler:表示當(dāng)前的請求處理器(即控制器方法),是一個處理當(dāng)前請求的目標(biāo)對象。
在preHandle方法中,你可以編寫自定義的攔截處理邏輯。
這包括但不限于以下內(nèi)容:
- 身份驗(yàn)證:檢查用戶是否已經(jīng)登錄或是否具有相應(yīng)的權(quán)限。如果驗(yàn)證失敗,可以中斷請求處理流程并返回false,或者進(jìn)行重定向到登錄頁面或錯誤頁面。
- 參數(shù)校驗(yàn):檢查請求參數(shù)的合法性和有效性,如檢查必填參數(shù)、參數(shù)格式等。如果參數(shù)不符合要求,可以中斷請求處理流程并返回false,或者返回錯誤信息給客戶端。
- 日志記錄:記錄請求的相關(guān)信息,如請求URL、請求方法、請求參數(shù)等,用于后續(xù)的跟蹤和分析。
- 跨域處理:檢查請求的來源域,判斷是否允許跨域訪問。如果不允許,可以進(jìn)行相應(yīng)的處理,如設(shè)置響應(yīng)頭或返回錯誤信息。
在方法的最后,根據(jù)業(yè)務(wù)需求,可以返回true繼續(xù)請求處理流程,或者返回false中斷請求處理流程。
返回false會阻止請求繼續(xù)傳遞給后續(xù)的攔截器或控制器方法。
需要注意的是,攔截器只作用于 Spring MVC 中的請求處理過程,并不影響其他類型的請求處理,如靜態(tài)資源的處理等。
同時,攔截器的執(zhí)行順序和配置方式也需要根據(jù)具體的需求和場景進(jìn)行合理的配置和調(diào)整。
HandlerInterceptor 源碼
HandlerInterceptor是springMVC項(xiàng)目中的攔截器,它攔截的目標(biāo)是請求的地址, 比MethodInterceptor先執(zhí)行。
實(shí)現(xiàn)一個HandlerInterceptor攔截器可以直接實(shí)現(xiàn)HandlerInterceptor接口,也可以繼承HandlerInterceptorAdapter類。
這兩種方法殊途同歸,其實(shí)HandlerInterceptorAdapter也就是聲明了HandlerInterceptor接口中所有方法的默認(rèn)實(shí)現(xiàn),而我們在繼承他之后只需要重寫必要的方法。
下面我們來看下HandlerInterceptor的源碼:
public interface HandlerInterceptor { default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { } }
- preHandler:目標(biāo)方法執(zhí)行完成之前
- postHanlder:目標(biāo)方法執(zhí)行完成之后
- afterComplete:頁面渲染以后
一般而言,我們的登錄攔截操做,等相關(guān)的攔截操做都可以定義在preHandler方法里面。
到此這篇關(guān)于Spring中的攔截器HandlerInterceptor詳細(xì)解析的文章就介紹到這了,更多相關(guān)HandlerInterceptor攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java線程池ThreadPoolExecutor源碼深入分析
ThreadPoolExecutor作為java.util.concurrent包對外提供基礎(chǔ)實(shí)現(xiàn),以內(nèi)部線程池的形式對外提供管理任務(wù)執(zhí)行,線程調(diào)度,線程池管理等等服務(wù)2022-08-08kafka并發(fā)寫大消息異常TimeoutException排查記錄
這篇文章主要為大家介紹了kafka并發(fā)寫大消息異常TimeoutException的排查記錄及解決方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02IDEA卡在”正在解析Maven依賴項(xiàng)“的解決方法
在創(chuàng)建新的SpringBoot項(xiàng)目時,始終卡在"正在解析Maven依賴項(xiàng)…",本文小編給大家介紹了幾種相關(guān)的解決方案,具有一定的參考價值,需要的朋友可以參考下2023-11-11解決springboot項(xiàng)目啟動報(bào)錯Field xxxMapper in com...xx
這篇文章主要介紹了解決springboot項(xiàng)目啟動報(bào)錯Field xxxMapper in com...xxxContr問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12一文搞懂接口參數(shù)簽名與驗(yàn)簽(附含java python php版)
這篇文章主要為大家介紹了java python php不同版的接口參數(shù)簽名與驗(yàn)簽示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06