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()),按需優化就可以了

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