基于springboot攔截器HandlerInterceptor的注入問(wèn)題
springboot攔截器HandlerInterceptor的注入
一、問(wèn)題描述
項(xiàng)目啟動(dòng)后,攔截器下的注入為null,影響攔截器的邏輯操作。如下圖:

二、解決策略
原因: 攔截器加載是在springcontext創(chuàng)建之前完成,詳情可以看spring的攔截器加載過(guò)程及IOC的關(guān)系
解決方案一:使用@Bean在攔截器初始化之前讓類加載,重點(diǎn)在于@Bean的攔截器處理及getCheckFilter()的引入
具體如下:
// 攔截器處理
public class CheckFilter implements HandlerInterceptor {
@Autowired
private SystemService systemService;
}
// 配置類處理
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Bean
public CheckFilter getCheckFilter(){
return new CheckFilter();
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getCheckFilter()).addPathPatterns("/**").
excludePathPatterns("/admin/auth/**");
super.addInterceptors(registry);
}
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
super.addResourceHandlers(registry);
}
@Override
protected void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/",".jsp");
super.configureViewResolvers(registry);
}
}
解決方案二:給攔截器增加配置注解如:@Configuration 、@Component 。在配置類中注入,具體如下操作:
// 攔截器處理
@Configuration //或者 @Component
public class CheckFilter implements HandlerInterceptor {
@Autowired
private SystemService systemService;
}
// 配置類處理
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Autowired
private CheckFilter checkFilter;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(checkFilter).addPathPatterns("/**").
excludePathPatterns("/admin/auth/**");
super.addInterceptors(registry);
}
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
super.addResourceHandlers(registry);
}
@Override
protected void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/",".jsp");
super.configureViewResolvers(registry);
}
}
三、知識(shí)總結(jié)
1、涉及spring的攔截器加載過(guò)程及IOC的管理
2、參考資料//www.dhdzp.com/article/223241.htm
springboot HandlerInterceptor 攔截器匹配規(guī)則寫(xiě)錯(cuò) 導(dǎo)致 攔截器無(wú)效
項(xiàng)目中發(fā)現(xiàn)攔截器無(wú)效,訪問(wèn)接口 /user/xxx/xxx 沒(méi)有進(jìn)入到攔截器中
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private UserInterceptor userInterceptor;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userInterceptor).addPathPatterns("/user/*");
}
}
原因是 攔截器的匹配規(guī)則弄錯(cuò)了。我希望 userInterceptor攔截器 攔截 /user/下所有路徑的接口
正確攔截規(guī)則是 /user/**
攔截規(guī)則粟子
addPathPatterns("/**") 表示攔截所有的請(qǐng)求,
addPathPatterns("/**") 表示攔截所有的請(qǐng)求,
addPathPatterns("/test/**") 表示攔截/test/ 下的所有路徑請(qǐng)求,
addPathPatterns("/test/*") 表示攔截/test/abc,攔截/test/aaa , 不攔截 /test/abc/def
addPathPatterns("/test/**").excludePathPatterns("/test/login", “/test/register”) 表示攔截/test/ 下的所有路徑請(qǐng)求,但不攔截 /test/login 和 /test/register
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MyBatis動(dòng)態(tài)SQL中的trim標(biāo)簽的使用方法
這篇文章主要介紹了MyBatis動(dòng)態(tài)SQL中的trim標(biāo)簽的使用方法,需要的朋友可以參考下2017-05-05
Spring中Controller和RestController的區(qū)別詳解
這篇文章主要介紹了Spring中Controller和RestController的區(qū)別詳解,@Controller是標(biāo)識(shí)一個(gè)Spring類是Spring MVC controller處理器,@Controller類中的方法可以直接通過(guò)返回String跳轉(zhuǎn)到j(luò)sp、ftl、html等模版頁(yè)面,需要的朋友可以參考下2023-09-09
詳解SpringMVC組件之HandlerMapping(二)
這篇文章主要介紹了詳解SpringMVC組件之HandlerMapping(二),HandlerMapping組件是Spring?MVC核心組件,用來(lái)根據(jù)請(qǐng)求的request查找對(duì)應(yīng)的Handler,在Spring?MVC中,有各式各樣的Web請(qǐng)求,每個(gè)請(qǐng)求都需要一個(gè)對(duì)應(yīng)的Handler來(lái)處理,需要的朋友可以參考下2023-08-08
ThreadLocal數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)原理解析
這篇文章主要為大家介紹了ThreadLocal數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
java發(fā)送heartbeat心跳包(byte轉(zhuǎn)16進(jìn)制)
這篇文章主要介紹了java發(fā)送heartbeat心跳包(byte轉(zhuǎn)16進(jìn)制),需要的朋友可以參考下2014-05-05

