SpringBoot項(xiàng)目整合攔截器詳解
什么是攔截器
java里的攔截器是動(dòng)態(tài)攔截Action調(diào)用的對象,它提供了一種機(jī)制可以使開發(fā)者在一個(gè)Action執(zhí)行的前后執(zhí)行一段代碼,也可以在一個(gè)Action執(zhí)行前阻止其執(zhí)行,同時(shí)也提供了一種可以提取Action中可重用部分代碼的方式。
在AOP中,攔截器用于在某個(gè)方法或者字段被訪問之前進(jìn)行攔截,然后再之前或者之后加入某些操作。
攔截器的應(yīng)用場景
- 日志記錄:可以記錄請求信息的日志,以便進(jìn)行信息監(jiān)控、信息統(tǒng)計(jì)等。
- 權(quán)限檢查:如登陸檢測,進(jìn)入處理器檢測是否登陸,如果沒有直接返回到登陸頁面。
- 性能監(jiān)控:典型的是慢日志。
攔截器的使用
自定義攔截器的步驟:
- 自定義攔截器類并實(shí)現(xiàn)HandlerInterceptor接口
/** * @author gf * @date 2023/2/6 */ @Component public class Intercepter1 implements HandlerInterceptor { @Override //在將請求發(fā)送到控制器controller之前執(zhí)行操作,若返回true就進(jìn)入控制器,若返回false就不進(jìn)入控制器了 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("token"); System.out.println("自定義攔截器1-----攔截到的token值為:"+token); return null != token; } @Override //用于在將響應(yīng)發(fā)送到客戶端之前執(zhí)行操作,就是控制器執(zhí)行完之后返回?cái)?shù)據(jù)時(shí)執(zhí)行。 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { System.out.println("自定義攔截器1-----控制器執(zhí)行完畢,返回?cái)?shù)據(jù)"); } @Override //在完成請求和響應(yīng)后執(zhí)行操作 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { System.out.println("自定義攔截器1-----響應(yīng)結(jié)束"); } }
自定義攔截器類,通過實(shí)現(xiàn)HandlerInterceptor接口并重寫他的三個(gè)方法,preHandle、postHandle、afterCompletion,實(shí)現(xiàn)攔截控制。
- preHandle:在將請求發(fā)送到控制器controller之前執(zhí)行操作,若返回true就進(jìn)入控制器,若返回false就不進(jìn)入控制器了。
- postHandle:用于在將響應(yīng)發(fā)送到客戶端之前執(zhí)行操作,就是控制器執(zhí)行完之后返回?cái)?shù)據(jù)時(shí)執(zhí)行。
- afterCompletion:在完成請求和響應(yīng)后執(zhí)行操作。
注冊自定義攔截器
攔截器的注冊是通過重寫WebMvcConfigurer接口的addInterceptors方法實(shí)現(xiàn)的,老版本的WebMvcConfigurerAdapter使用時(shí)發(fā)現(xiàn)已經(jīng)被淘汰了,不推薦使用了。
/** * @author gf * @date 2023/2/6 */ @Configuration public class InterceptConfig implements WebMvcConfigurer { //引入自定義攔截器對象 @Resource private Intercepter1 Intercepter1; //重寫addInterceptors方法注冊攔截器 @Override public void addInterceptors(InterceptorRegistry registry) { //addPathPatterns方法添加攔截路徑匹配規(guī)則("/**"是攔截所有),excludePathPatterns方法是設(shè)置白名單,放行哪些路 registry.addInterceptor(Intercepter1).addPathPatterns("/**").excludePathPatterns("/test/*").order(1); } }
測試效果
編寫測試類
@GetMapping("/test") public BaseResponse<String> sayHello(@RequestParam("name") String name){ if(!name.equals("老王")){ throw new BaseException(BaseErrorEnum.USER_NOT_EXIST); } else{ return RespGenerator.success("調(diào)用成功"); } }
測試先不傳token
可以看到不傳token時(shí),preHandle方法返回false,不在執(zhí)行后面的方法
測試傳token
可以看到傳遞token后,攔截器放行,執(zhí)行了后面的方法,
攔截器的優(yōu)先級
我們重新再增加兩個(gè)攔截器
設(shè)置Order的值
請求接口,查看攔截器的執(zhí)行順序
對于order的順序:攔截器的preHandle方法是根據(jù)order的大小從小到大順序執(zhí)行,postHandle和afterCompletion方法是根據(jù)order的大小從小到大倒敘執(zhí)行。
攔截器和過濾器的區(qū)別
攔截器是spring在基于反射機(jī)制實(shí)現(xiàn)的,過濾器是基于servlet的回調(diào)實(shí)現(xiàn)的;
攔截器可以獲取IOC容器中的各個(gè)bean,而過濾器就不行,這點(diǎn)很重要,在攔截器里注入一個(gè)service,可以調(diào)用業(yè)務(wù)邏輯
深度不同:過濾器只在Servlet前后起作用,而攔截器可以深入到方法前后,異常拋出前后等,相比較過濾器具有更大的彈性。
到此這篇關(guān)于SpringBoot項(xiàng)目整合攔截器詳解的文章就介紹到這了,更多相關(guān)SpringBoot整合攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入聊一聊springboot項(xiàng)目全局異常處理那些事兒
最近在做項(xiàng)目時(shí)需要對異常進(jìn)行全局統(tǒng)一處理,所以下面這篇文章主要給大家介紹了關(guān)于springboot項(xiàng)目全局異常處理那些事兒,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01SpringBoot實(shí)現(xiàn)excel生成并且通過郵件發(fā)送的步驟詳解
實(shí)際開發(fā)中,特別是在B端產(chǎn)品的開發(fā)中,我們經(jīng)常會(huì)遇到導(dǎo)出excel的功能,更進(jìn)階一點(diǎn)的需要我們定期生成統(tǒng)計(jì)報(bào)表,然后通過郵箱發(fā)送給指定的人員,?今天要帶大家來實(shí)現(xiàn)的就是excel生成并通過郵件發(fā)送,需要的朋友可以參考下2023-10-10了解java中的Clojure如何抽象并發(fā)性和共享狀態(tài)
Clojure是一種運(yùn)行在Java平臺上的 Lisp 方言,Lisp是一種以表達(dá)性和功能強(qiáng)大著稱的編程語言,但人們通常認(rèn)為它不太適合應(yīng)用于一般情況,而Clojure的出現(xiàn)徹底改變了這一現(xiàn)狀。,需要的朋友可以參考下2019-06-06Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法
這篇文章主要介紹了Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法,涉及Java數(shù)學(xué)運(yùn)算計(jì)算隨機(jī)數(shù)及字符串操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11基于Java實(shí)現(xiàn)圖形驗(yàn)證碼工具類
這篇文章主要為大家詳細(xì)介紹了如何基于Java實(shí)現(xiàn)圖形驗(yàn)證碼工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11spring-boot中的SPI機(jī)制實(shí)例講解
這篇文章主要介紹了spring-boot中的SPI機(jī)制實(shí)例講解,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07