###文章鏈接
項目目錄結構
在geek工程中我設置了自定義攔截器,且訪問首頁的時候不走攔截器
public class WebMVCInterceptor implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(globalInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/index")
;
}
/**
* @return globalInterceptor
*/
@Bean
public GlobalInterceptor globalInterceptor() {
return new GlobalInterceptor();
}
}
但是事實上卻是這樣
14:10:59.606 [http-nio-80-exec-2] INFO c.g.c.interceptor.GlobalInterceptor - /css/base.css
14:10:59.608 [http-nio-80-exec-2] INFO c.g.c.interceptor.GlobalInterceptor - 第1次進入攔截器
14:10:59.612 [http-nio-80-exec-3] INFO c.g.c.interceptor.GlobalInterceptor - /css/index.css
14:10:59.613 [http-nio-80-exec-3] INFO c.g.c.interceptor.GlobalInterceptor - 第2次進入攔截器
14:10:59.620 [http-nio-80-exec-5] INFO c.g.c.interceptor.GlobalInterceptor - /css/page.css
14:10:59.621 [http-nio-80-exec-5] INFO c.g.c.interceptor.GlobalInterceptor - 第3次進入攔截器
14:10:59.622 [http-nio-80-exec-7] INFO c.g.c.interceptor.GlobalInterceptor - /css/login.css
14:10:59.623 [http-nio-80-exec-7] INFO c.g.c.interceptor.GlobalInterceptor - 第4次進入攔截器
14:10:59.626 [http-nio-80-exec-4] INFO c.g.c.interceptor.GlobalInterceptor - /css/m.css
14:10:59.627 [http-nio-80-exec-4] INFO c.g.c.interceptor.GlobalInterceptor - 第5次進入攔截器
14:10:59.622 [http-nio-80-exec-6] INFO c.g.c.interceptor.GlobalInterceptor - /css/loading.css
14:10:59.637 [http-nio-80-exec-6] INFO c.g.c.interceptor.GlobalInterceptor - 第6次進入攔截器
靜態資源全部走了攔截器了
我的springboot版本是2.0以上,當spring boot版本升級爲2.x時,由於2.x依賴的是spring5.x,所以訪問靜態資源就會被HandlerInterceptor攔截,源碼如下:
/**
* Return a handler mapping ordered at Integer.MAX_VALUE-1 with mapped
* resource handlers. To configure resource handling, override
* {@link #addResourceHandlers}.
*/
@Bean
public HandlerMapping resourceHandlerMapping() {
Assert.state(this.applicationContext != null, "No ApplicationContext set");
Assert.state(this.servletContext != null, "No ServletContext set");
ResourceHandlerRegistry registry = new ResourceHandlerRegistry(this.applicationContext,
this.servletContext, mvcContentNegotiationManager(), mvcUrlPathHelper());
addResourceHandlers(registry);
AbstractHandlerMapping handlerMapping = registry.getHandlerMapping();
if (handlerMapping != null) {
handlerMapping.setPathMatcher(mvcPathMatcher());
handlerMapping.setUrlPathHelper(mvcUrlPathHelper());
// 此處是將所有的HandlerInterceptor都添加了(包含自定義的HandlerInterceptor)
handlerMapping.setInterceptors(getInterceptors());
handlerMapping.setCorsConfigurations(getCorsConfigurations());
}
else {
handlerMapping = new EmptyHandlerMapping();
}
return handlerMapping;
}
/**
* Provide access to the shared handler interceptors used to configure
* {@link HandlerMapping} instances with. This method cannot be overridden,
* use {@link #addInterceptors(InterceptorRegistry)} instead.
*/
protected final Object[] getInterceptors() {
if (this.interceptors == null) {
InterceptorRegistry registry = new InterceptorRegistry();
// 此處傳入新new的registry對象,在配置類當中設置自定義的HandlerInterceptor後即可獲取到
addInterceptors(registry);
registry.addInterceptor(new ConversionServiceExposingInterceptor(mvcConversionService()));
registry.addInterceptor(new ResourceUrlProviderExposingInterceptor(mvcResourceUrlProvider()));
this.interceptors = registry.getInterceptors();
}
return this.interceptors.toArray();
}
從源碼當中可以看出,使用spring5.x時,靜態資源也會執行自定義的攔截器,因此在配置攔截器的時候需要指定排除靜態資源的訪問路徑,作如下優化:
.excludePathPatterns(Arrays.asList("/css/**", "/js/**","/images/**","/editormd/**"))