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


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

項目結構:

  • 直接上圖

如果是在舊版,需要訪問下圖靜態資源,

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

然而,在2.0之后 就發生了變化。

先看本文的基礎,攔截器

BaseInterceptor

  • 毫無疑問,需要定義一個類:BaseInterceptor 應實現 HandlerInterceptor

  • 在其 preHandle中 需要重寫,自定義攔截配置,大概如下圖:

  • 作用:攔截沒有登錄,並試圖知己訪問后台的地址的操作。

再看本文的關鍵,WebMvcConfig

  • 此類需要實現 WebMvcConfigurer

  • 在舊版中,一般繼承 WebMvcConfigurerAdapter類,但由於2.0后,WebMvcConfigurer 接口中定義了很多default方法(基於jdk1.8+ )

  • WebMvcConfigurer中配置如下:

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

@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/1795346

  • WebMvcConfig addInterceptors方法中,添加排除路徑;
  • 但是尷尬的是,我copy的項目結構不太一樣,static/template下方都有 admin文件夾,並且登錄訪問還是admin開始
  • 如果排除靜態資源的話,那些需要跳轉的html也被排除了 。

18-5-23日更新

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

18-7-31日更新

  • 僅供參考。等搞清楚再來更新。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM