SpringBoot攔截器excludePathPatterns方法不生效的解決方案
SpringBoot攔截器excludePathPatterns方法不生效
在攔截器用 excludePathPatterns() 方法排除訪問路徑時(shí),發(fā)現(xiàn)不生效,配置代碼如下
/**
* @author 程序員大佬超
* @date 2023-03-01 15:33.
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
AuthTokenInterceptor authTokenInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
List<String> patterns = new ArrayList<>();
patterns.add("/**/login/login");
registry.addInterceptor(authTokenInterceptor)
.addPathPatterns("/**")
.excludePathPatterns(patterns);
}
}接口訪問地址:http://127.0.0.1:8088/api-im/login/login
其實(shí)這個(gè)問題大部分情況下無非兩個(gè)原因:
1、要排除的這個(gè)訪問路徑配置馬虎寫錯(cuò)了。
2、要排除的這個(gè)訪問路徑就不存在,或者請(qǐng)求參數(shù)不對(duì)解析出錯(cuò),這時(shí)SpringBoot會(huì)將路徑自動(dòng)變成/error,具體可以在自定義攔截器里打斷點(diǎn)驗(yàn)證一下。
我這里就是第二個(gè)原因,可以看到自定義的攔截器里 requestURI 變成了 /error。

解決方法
保證接口正確或者檢查請(qǐng)求參數(shù),反正要保證能正常進(jìn)入,我這就是請(qǐng)求頭里少了一個(gè)參數(shù),然后解析的時(shí)候日志里其實(shí)已經(jīng)提示缺失請(qǐng)求頭了。
WARN 15628 --- [nio-8088-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver :
Resolved [org.springframework.web.bind.MissingRequestHeaderException: Required request header 'test' for method parameter type String is not present]
然后,加上即可

springboot攔截器實(shí)現(xiàn)
1.創(chuàng)建一個(gè)類,實(shí)現(xiàn)WebMvxConfigurer,重寫addInterceptors,添加需要攔截的路徑,以及放行的路徑
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
? ? @Override
? ? public void addInterceptors(InterceptorRegistry registry) {
? ? ? ? try {
//MyLoginInterception這個(gè)類是攔截的條件(如是否需要登錄,需要單獨(dú)來寫,請(qǐng)看下面)
//excludePathPatterns這個(gè)是不需要進(jìn)行攔截的操作路徑。
registry.addInterceptor(MyLoginInterception.class.newInstance()).addPathPatterns("/**")
? ? ? ? ? ? ? ? ? ? .excludePathPatterns("/login", "/register", "/**/*.js", "/**/*.css", "/**/*.html");
? ? ? ? } catch (InstantiationException e) {
? ? ? ? ? ? throw new RuntimeException(e);
? ? ? ? } catch (IllegalAccessException e) {
? ? ? ? ? ? throw new RuntimeException(e);
? ? ? ? }
? ? }
}2.創(chuàng)建類,對(duì)攔截路徑的請(qǐng)求做條件判斷
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Configuration
public class MyLoginInterception implements HandlerInterceptor {
? ? @Override
? ? public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
? ? ? ? System.out.println("------------start------------");
//這里方便測(cè)試,對(duì)請(qǐng)求頭帶有”source“:”back“ 進(jìn)行放行
? ? ? ? if (null == request.getHeader("source") || !request.getHeader("source").equals("back")) {
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? return true;
? ? }
? ? @Override
? ? public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
? ? ? ? System.out.println("攔截器執(zhí)行結(jié)束");
? ? ? ? HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
? ? }
? ? @Override
? ? public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
? ? ? ? System.out.println("數(shù)據(jù)返回,執(zhí)行結(jié)束");
? ? ? ? HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
? ? }
}攔截器的實(shí)現(xiàn)比較簡(jiǎn)單,比較難的是根據(jù)業(yè)務(wù),做相關(guān)處理,如對(duì)cook,session的處理,以及各種條件的處理
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot Logback日志多文件輸出方式(按日期和大小分割)
這篇文章主要介紹了Springboot Logback日志多文件輸出方式(按日期和大小分割),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
flowable動(dòng)態(tài)創(chuàng)建多級(jí)流程模板實(shí)現(xiàn)demo
這篇文章主要為大家介紹了flowable動(dòng)態(tài)創(chuàng)建多級(jí)流程模板實(shí)現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
SpringBoot創(chuàng)建Docker鏡像的方法步驟
這篇文章主要介紹了SpringBoot創(chuàng)建Docker鏡像的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
基于spring boot排除掃描類的三種方式小結(jié)
這篇文章主要介紹了spring boot排除掃描類的三種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
spring boot中使用http請(qǐng)求的示例代碼
本篇文章主要介紹了spring boot中 使用http請(qǐng)求的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
Java Spring使用hutool的HttpRequest發(fā)送請(qǐng)求的幾種方式
文章介紹了Hutool庫中用于發(fā)送HTTP請(qǐng)求的工具,包括添加依賴、發(fā)送GET和POST請(qǐng)求的方法,以及GET請(qǐng)求的不同參數(shù)傳遞方式,感興趣的朋友跟隨小編一起看看吧2024-11-11

