SpringBoot項目整合攔截器詳解
什么是攔截器
java里的攔截器是動態(tài)攔截Action調(diào)用的對象,它提供了一種機制可以使開發(fā)者在一個Action執(zhí)行的前后執(zhí)行一段代碼,也可以在一個Action執(zhí)行前阻止其執(zhí)行,同時也提供了一種可以提取Action中可重用部分代碼的方式。
在AOP中,攔截器用于在某個方法或者字段被訪問之前進行攔截,然后再之前或者之后加入某些操作。
攔截器的應(yīng)用場景
- 日志記錄:可以記錄請求信息的日志,以便進行信息監(jiān)控、信息統(tǒng)計等。
- 權(quán)限檢查:如登陸檢測,進入處理器檢測是否登陸,如果沒有直接返回到登陸頁面。
- 性能監(jiān)控:典型的是慢日志。
攔截器的使用
自定義攔截器的步驟:
- 自定義攔截器類并實現(xiàn)HandlerInterceptor接口
/**
* @author gf
* @date 2023/2/6
*/
@Component
public class Intercepter1 implements HandlerInterceptor {
@Override
//在將請求發(fā)送到控制器controller之前執(zhí)行操作,若返回true就進入控制器,若返回false就不進入控制器了
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í)行完之后返回數(shù)據(jù)時執(zhí)行。
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("自定義攔截器1-----控制器執(zhí)行完畢,返回數(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é)束");
}
}自定義攔截器類,通過實現(xiàn)HandlerInterceptor接口并重寫他的三個方法,preHandle、postHandle、afterCompletion,實現(xiàn)攔截控制。
- preHandle:在將請求發(fā)送到控制器controller之前執(zhí)行操作,若返回true就進入控制器,若返回false就不進入控制器了。
- postHandle:用于在將響應(yīng)發(fā)送到客戶端之前執(zhí)行操作,就是控制器執(zhí)行完之后返回數(shù)據(jù)時執(zhí)行。
- afterCompletion:在完成請求和響應(yīng)后執(zhí)行操作。
注冊自定義攔截器
攔截器的注冊是通過重寫WebMvcConfigurer接口的addInterceptors方法實現(xiàn)的,老版本的WebMvcConfigurerAdapter使用時發(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時,preHandle方法返回false,不在執(zhí)行后面的方法
測試傳token


可以看到傳遞token后,攔截器放行,執(zhí)行了后面的方法,
攔截器的優(yōu)先級
我們重新再增加兩個攔截器

設(shè)置Order的值

請求接口,查看攔截器的執(zhí)行順序

對于order的順序:攔截器的preHandle方法是根據(jù)order的大小從小到大順序執(zhí)行,postHandle和afterCompletion方法是根據(jù)order的大小從小到大倒敘執(zhí)行。
攔截器和過濾器的區(qū)別
攔截器是spring在基于反射機制實現(xiàn)的,過濾器是基于servlet的回調(diào)實現(xiàn)的;
攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,這點很重要,在攔截器里注入一個service,可以調(diào)用業(yè)務(wù)邏輯
深度不同:過濾器只在Servlet前后起作用,而攔截器可以深入到方法前后,異常拋出前后等,相比較過濾器具有更大的彈性。
到此這篇關(guān)于SpringBoot項目整合攔截器詳解的文章就介紹到這了,更多相關(guān)SpringBoot整合攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實現(xiàn)excel生成并且通過郵件發(fā)送的步驟詳解
實際開發(fā)中,特別是在B端產(chǎn)品的開發(fā)中,我們經(jīng)常會遇到導(dǎo)出excel的功能,更進階一點的需要我們定期生成統(tǒng)計報表,然后通過郵箱發(fā)送給指定的人員,?今天要帶大家來實現(xiàn)的就是excel生成并通過郵件發(fā)送,需要的朋友可以參考下2023-10-10
了解java中的Clojure如何抽象并發(fā)性和共享狀態(tài)
Clojure是一種運行在Java平臺上的 Lisp 方言,Lisp是一種以表達性和功能強大著稱的編程語言,但人們通常認(rèn)為它不太適合應(yīng)用于一般情況,而Clojure的出現(xiàn)徹底改變了這一現(xiàn)狀。,需要的朋友可以參考下2019-06-06

