一文教你搞懂SpringBoot自定義攔截器的思路
思維導(dǎo)圖
前言
在開(kāi)發(fā)中,都離不開(kāi)攔截器的使用。比如說(shuō)在開(kāi)發(fā)登錄功能時(shí),采用JWT登錄時(shí)通過(guò)對(duì)token進(jìn)行驗(yàn)證實(shí)現(xiàn)登錄攔截的功能;實(shí)現(xiàn)權(quán)限管理功能時(shí),通過(guò)對(duì)角色權(quán)限的攔截實(shí)現(xiàn)權(quán)限功能。下面帶你使用SpringBoot梳理自定義攔截器的思路。
前置知識(shí)
@Configuration
:用于標(biāo)識(shí)一個(gè)全局配置類(lèi)。注冊(cè)到spring容器中,相當(dāng)于xml配置時(shí)的beans標(biāo)簽。@Bean
:用于標(biāo)識(shí)全局配置類(lèi)中的自定義攔截方法上,進(jìn)行攔截對(duì)象的創(chuàng)建,方便后續(xù)注冊(cè)。
具體實(shí)現(xiàn)步驟
定義攔截器類(lèi)
自定義攔截器類(lèi):負(fù)責(zé)定義攔截的處理邏輯,包含前置攔截、后置攔截和最終攔截。以下是對(duì)其API的介紹。
API介紹
在方法參數(shù)中,HttpServletRequest代表客戶(hù)端的請(qǐng)求,HttpServletResponse代表返回給客戶(hù)端的響應(yīng)。Object handler是目標(biāo)處理器(如控制器方法)的實(shí)例,ModelAndView用于傳遞模型數(shù)據(jù)和視圖名稱(chēng)。
方法名 | 方法簽名 | 作用 |
---|---|---|
preHandle | boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception | 在目標(biāo)處理器執(zhí)行之前被調(diào)用??梢赃M(jìn)行一些前置處理邏輯,如權(quán)限驗(yàn)證、日志記錄等。返回值決定請(qǐng)求是否繼續(xù)執(zhí)行后續(xù)流程,true表示繼續(xù)執(zhí)行,false表示中斷請(qǐng)求處理 |
postHandle | void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception | 在目標(biāo)處理器執(zhí)行之后、視圖渲染之前被調(diào)用??梢詫?duì)響應(yīng)結(jié)果進(jìn)行一些后置處理,如添加公共數(shù)據(jù)、修改視圖等。此時(shí)可以對(duì)目標(biāo)處理器的執(zhí)行結(jié)果進(jìn)行修改 |
afterCompletion | void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception | 在整個(gè)請(qǐng)求處理完畢后被調(diào)用??梢赃M(jìn)行一些清理工作,如資源釋放、日志記錄等。無(wú)法改變響應(yīng)結(jié)果 |
思路:
- 創(chuàng)建攔截器類(lèi)TestInterceptor并實(shí)現(xiàn)HandlerInterceptor。
- 根據(jù)其對(duì)應(yīng)的API結(jié)合業(yè)務(wù),在對(duì)應(yīng)方法上實(shí)現(xiàn)相應(yīng)的處理邏輯。
public class TestInterceptor implements HandlerInterceptor { //前置處理器。進(jìn)入到Controller層方法之前執(zhí)行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //TODO 前置攔截的處理邏輯 //1.判斷用戶(hù)是否登錄,登錄返回true return HandlerInterceptor.super.preHandle(request, response, handler); } //后置處理器。視圖渲染之前執(zhí)行的方法,對(duì)響應(yīng)結(jié)果進(jìn)行處理。 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { //TODO 后置攔截的處理邏輯 //添加某些數(shù)據(jù)等等 HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } //最終處理器。整個(gè)請(qǐng)求完成之后執(zhí)行。 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // TODO 最終攔截處理器 //1.記錄日志 HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
定義攔截器配置類(lèi)
攔截器配置類(lèi):負(fù)責(zé)注冊(cè)相應(yīng)的攔截器。
思路:
- 創(chuàng)建攔截器配置類(lèi)。并用@Configuration標(biāo)識(shí)、實(shí)現(xiàn)WebMvcConfigurer接口。
- 創(chuàng)建生成攔截器對(duì)象的方法。并用@Bean標(biāo)識(shí)。方便攔截器的注冊(cè)。
- 實(shí)現(xiàn)addInterceptors方法,進(jìn)行攔截器的注冊(cè)。
@Configuration public class TestInterceptorConfig implements WebMvcConfigurer { @Bean public TestInterceptor testInterceptor(){ return new TestInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(testInterceptor()).addPathPatterns("/test/**"); WebMvcConfigurer.super.addInterceptors(registry); } }
攔截器失效
如果發(fā)生攔截器沒(méi)有生效,可以按照以下思路進(jìn)行檢查:
攔截器配置類(lèi)是否添加@Configuration。攔截的是接口地址,地址末尾則為/**格式。攔截的是目錄地址,地址則為/*/格式。 ??寫(xiě)在最后
到此這篇關(guān)于一文教你搞懂SpringBoot自定義攔截器的思路的文章就介紹到這了,更多相關(guān)SpringBoot自定義攔截器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring實(shí)戰(zhàn)之抽象Bean和子Bean定義與用法示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之抽象Bean和子Bean定義與用法,結(jié)合實(shí)例形式分析了Spring抽象Bean和子Bean相關(guān)配置、定義與使用操作技巧,需要的朋友可以參考下2019-11-11JAVA實(shí)現(xiàn)賬戶(hù)取款和存款操作
這篇文章主要介紹了JAVA實(shí)現(xiàn)賬戶(hù)取款和存款操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11基于java集合中的一些易混淆的知識(shí)點(diǎn)(詳解)
下面小編就為大家?guī)?lái)一篇基于java集合中的一些易混淆的知識(shí)點(diǎn)(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09SpringBoot整合MyBatisPlus配置動(dòng)態(tài)數(shù)據(jù)源的方法
這篇文章主要介紹了SpringBoot整合MyBatisPlus配置動(dòng)態(tài)數(shù)據(jù)源的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05Java詳解HashMap實(shí)現(xiàn)原理和源碼分析
這篇文章主要介紹了Java關(guān)于HashMap的實(shí)現(xiàn)原理并進(jìn)行源碼分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09SpringCloud修改Feign日志記錄級(jí)別過(guò)程淺析
OpenFeign源于Netflix的Feign,是http通信的客戶(hù)端。屏蔽了網(wǎng)絡(luò)通信的細(xì)節(jié),直接面向接口的方式開(kāi)發(fā),讓開(kāi)發(fā)者感知不到網(wǎng)絡(luò)通信細(xì)節(jié)。所有遠(yuǎn)程調(diào)用,都像調(diào)用本地方法一樣完成2023-02-02