spring boot 2.0 + 靜態資源被攔截,怎麼辦?

問題描述:使用springboot 2.0後,按照springboot 1.5版本(如下簡稱舊版)的方式去配置項目。結果發現靜態資源訪問不到了,本文對此狀況分析、處理

項目結構:

  • 直接上圖

若是是在舊版,須要訪問下圖靜態資源,
html

地址應該爲: localhost:8080/admin/js/base.js
緣由在於:META-INF/resources / resources / static / public 都是spring boot 認爲靜態資源應該放置的位置,會自動去尋找靜態資源web

然而,在2.0以後 就發生了變化。

先看本文的基礎,攔截器

BaseInterceptor

  • 毫無疑問,須要定義一個類:BaseInterceptor 應實現 HandlerInterceptor
  • 在其 preHandle中 須要重寫,自定義攔截配置,大概以下圖:
    spring

  • 做用:攔截沒有登陸,並試圖知己訪問後臺的地址的操做。springboot

再看本文的關鍵,WebMvcConfig

  • 此類須要實現 WebMvcConfigurer
  • 在舊版中,通常繼承 WebMvcConfigurerAdapter類,但因爲2.0後,WebMvcConfigurer 接口中定義了不少default方法(基於jdk1.8+ )
  • WebMvcConfigurer中配置以下:mvc

  • 注意:須要在重寫的第二個方法中,添加靜態資源路徑,這是可否被識別的關鍵ide

@Component
public class WebMvcConfig implements WebMvcConfigurer {
    @Resource
    private BaseInterceptor baseInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(baseInterceptor)
                //須要配置2:----------- 告知攔截器:/static/admin/** 與 /static/user/** 不須要攔截 (配置的是 路徑)
                .excludePathPatterns("/static/admin/**", "/static/user/**");
    }

    /**
     * 添加靜態資源文件,外部能夠直接訪問地址
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //其餘靜態資源,與本文關係不大
        registry.addResourceHandler("/upload/**").addResourceLocations("file:"+ TaleUtils.getUplodFilePath()+"upload/");

        //須要配置1:----------- 須要告知系統,這是要被當成靜態文件的!
        //第一個方法設置訪問路徑前綴,第二個方法設置資源路徑
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //registry.addViewController("/error/404").setViewName("/admin/page_error/error_404.html");
    }
}

按照如上配置

  • 訪問:http://localhost:9090/static/admin/js/base.js,便可正常訪問到。
  • 也就是在html文件中,不要像以前同樣,/admin/js/base.js 而應該在前方加上addResourceHandlers中配置的名字

以前誰在攔截靜態資源?

  • 能夠在aseInterceptor 中的 preHandle() 方法體內打斷點,會發現訪問static下的靜態資源時候會進入此方法。
  • 也就是被其當作正常的訪問路徑去識別。致使沒法正常加載。
  • 換句話說,也就是配置的不完整,致使靜態資源沒有被識別。

還能夠參考

https://my.oschina.net/dengfuwei/blog/1795346spa

  • WebMvcConfigaddInterceptors方法中,添加排除路徑;
  • 可是尷尬的是,我copy的項目結構不太同樣,static/template下方都有 admin文件夾,而且登陸訪問仍是admin開始
  • 若是排除靜態資源的話,那些須要跳轉的html也被排除了 。

18-5-23日更新

  • 原文中的配置仍是有問題!
  • 仍是應該在 WebMvcConfig 中的 addInterceptors 排除路徑,原來雖然能訪問到靜態資源,可是仍是被攔截器中的 preHandle攔截!
  • 因此仍是應該配置排除攔截的路徑,上方 WebMvcConfig類中內容已更改~

18-7-31日更新

  • 僅供參考。等搞清楚再來更新。
相關文章
相關標籤/搜索