Spring MVC攔截器到底怎么寫?你會嗎?
前言:攔截器是什么鬼?
哈嘍,小伙伴們!今天又是元氣滿滿的小米,來和大家嘮點面試中的那些“坑”!
前幾天有個粉絲給我留言:
小米哥,我面試社招Java崗,被問到“Spring MVC里面攔截器是怎么寫的?”。我當時懵了,這攔截器到底是什么?
一聽這問題,我差點笑噴,攔截器還真是個社招高頻題,很多人面試時總是一臉懵,尤其是項目中沒正兒八經用過的小伙伴。
別急,今天我就帶你把這個問題徹底搞透!
故事開場:面試中的靈魂三連問
話說那天,我也遇到個大廠的技術面試官,剛落座,面試官就開始“靈魂三連問”——
- 你用過Spring MVC攔截器嗎?
- 你知道攔截器的用途和實現原理嗎?
- 能現場寫個簡單攔截器嗎?
我嘴角一抽,心想:這直接三連擊,連喘口氣的機會都不給啊!
還好,作為老碼農的小米,積累還是有的,于是我深吸一口氣,開始表演!
Spring MVC攔截器:靈魂解讀
1. 攔截器是干啥的?
我先用一句話總結:攔截器(Interceptor)是Spring MVC提供的一種機制,類似于Servlet中的過濾器(Filter),用于對請求進行預處理和后處理。
用大白話解釋,攔截器就像保安大哥:
- 你要進門,先查一下(預處理);
- 進去了,看你在干啥(控制);
- 出門的時候再檢查一遍(后處理)。
2. Spring MVC攔截器的生命周期
面試官點了點頭,繼續追問:“那攔截器的生命周期是什么?”
我趕緊接上:
攔截器主要有三個核心方法,分別在請求的不同階段被調用:
- preHandle(): 在請求處理之前調用,決定是否放行。
- postHandle(): 在請求處理之后、視圖渲染之前調用。
- afterCompletion(): 在整個請求完成之后調用,通常用于資源清理。
小技巧:想象一下,從進門到離開,保安大哥先查證件(preHandle),然后監控看你在做什么(postHandle),最后檢查你是否順利離開(afterCompletion)。
面試現場:手寫一個攔截器!
面試官滿意地點點頭,笑瞇瞇地問:“那你寫一個簡單的攔截器試試?”
我胸有成竹,擼起袖子就是干!
1. 新建攔截器類
圖片
劃重點:
- preHandle(): 檢查請求頭中是否有有效Token。
- postHandle(): 在控制器執行完后打印日志。
- afterCompletion(): 請求完全結束后做清理工作。
2. 配置攔截器
在Spring配置文件WebConfig.java中添加:
圖片
小技巧:
- addPathPatterns():指定攔截的URL路徑。
- excludePathPatterns():排除特定路徑。
攔截器和過濾器的區別?
剛碼完,面試官又來了:“攔截器和過濾器的區別是什么?”
我心里暗笑:早就料到了!
- 攔截器(Interceptor): 基于Spring MVC,依賴于HandlerMapping和HandlerAdapter。
- 過濾器(Filter): 基于Servlet規范,在整個應用上下文中生效。
- 區別:
a.使用場景不同: Filter多用于全局過濾,如字符編碼、日志記錄等;Interceptor用于MVC中的特定控制器攔截。
b.調用時機不同: Filter在Servlet容器啟動時加載,而Interceptor在Spring容器啟動時加載。
實際場景:攔截器的花式用法
- 登錄驗證: 判斷用戶是否登錄,未登錄直接跳轉登錄頁。
- 權限校驗: 檢查用戶角色是否符合接口權限。
- 日志記錄: 記錄請求的開始時間和結束時間,計算接口耗時。
- 異常處理: 統一異常攔截,給前端返回格式化的錯誤信息。
面試收尾:掌握攔截器,面試再不慌
面試官微微一笑,點頭道:“很好。”
我長舒一口氣,心想:果然功夫不負有心人。
親愛的小伙伴們,Spring MVC的攔截器不僅是面試重點,更是開發中不可或缺的一部分。掌握了攔截器的原理、用法和配置,面對面試官時就能自信滿滿啦!
希望今天的小故事能幫到你們,下次面試的時候不再手忙腳亂!