springboot静态资源会被HandlerInterceptor拦截的原因和解决方法

###文章链接

项目目录结构

在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/**"))

先查看你自己静态资源访问路径,通过(request.getRequestURI()),按需优化就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章