###文章链接
项目目录结构
在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/**"))