springboot攔截器HandlerInterceptor的注入
一、問題描述
項目啟動后,攔截器下的注入為null,影響攔截器的邏輯操作。如下圖:
二、解決策略
原因: 攔截器加載是在springcontext創(chuàng)建之前完成,詳情可以看spring的攔截器加載過程及IOC的關(guān)系
解決方案一:使用@Bean在攔截器初始化之前讓類加載,重點在于@Bean的攔截器處理及getCheckFilter()的引入
具體如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
// 攔截器處理 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 。在配置類中注入,具體如下操作:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
// 攔截器處理 @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); } } |
三、知識總結(jié)
1、涉及spring的攔截器加載過程及IOC的管理
2、參考資料http://www.ythuaji.com.cn/article/218698.html
springboot HandlerInterceptor 攔截器匹配規(guī)則寫錯 導(dǎo)致 攔截器無效
項目中發(fā)現(xiàn)攔截器無效,訪問接口 /user/xxx/xxx 沒有進入到攔截器中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@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ī)則弄錯了。我希望 userInterceptor攔截器 攔截 /user/下所有路徑的接口
正確攔截規(guī)則是 /user/**
攔截規(guī)則粟子
addPathPatterns("/**")
表示攔截所有的請求,
addPathPatterns("/**")
表示攔截所有的請求,
addPathPatterns("/test/**")
表示攔截/test/ 下的所有路徑請求,
addPathPatterns("/test/*")
表示攔截/test/abc,攔截/test/aaa , 不攔截 /test/abc/def
addPathPatterns("/test/**").excludePathPatterns("/test/login", “/test/register”)
表示攔截/test/ 下的所有路徑請求,但不攔截 /test/login 和 /test/register
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:https://blog.csdn.net/baidu_28068985/article/details/106659825