首頁 > 軟體

springboot存取靜態資源遇到的坑及解決

2022-03-18 13:01:21

存取靜態資源遇到的坑及解決

開始是以這種結構進行的,結果頁面上一篇紅,存取的頁面是這樣的

最終找出來問題,雖然每次調整路徑都不對,最終檢視多種方法可以看到了:

增加:

package com.example.demo.config;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Component
public class WebConfig implements WebMvcConfigurer {
/*
     * 新增靜態資原始檔,外部可以直接存取地址
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }
}

這樣就可以地方問到了:

直接存取靜態資源的問題

一般現在都前後端分離方式,SpringBoot主要提供介面服務,但有時候有一些小專案就希望一個jar前後端都搞定,因此一些頁面等靜態資源都放入SpringBoot中。 這裡記錄一下靜態資源存取方式和引入shiro後的修改。

SpringBoot 預設靜態資源存取設定

SpringBoot 預設設定就可以直接URL存取下面路徑下的靜態資源

  • classpath:/META-INF/resources/
  • classpath:/resources/
  • classpath:/static/
  • classpath:/public/

順序優先順序按照上面的順序

假設埠設為8080,URL存取 http://localhost:8080/index.html 請注意URL路徑中不用加static/

測試結果發現,優先存取的 META-INF->resources 下的index.html

SpringBoot 預設設定的靜態資源路徑的值由變數spring.resources.static-locations控制,一般我們也不用去修改它

spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/
static/,classpath:/public/ # Locations of static resources.

引入shiro 或 security後的攔截過濾

假設一開始 shiro或security對SpringBoot的所有存取路徑(/**)都做了攔截,這種情況下,我希望將我的頁面、js、css、圖片等靜態資源放入static下,讓shiro或security不攔截這些資源,如何設定?

假設你的靜態資源目錄如下:

一開始以為這樣:

filterRuleMap.put("/static/**", "anon");

即放開static路徑下的所有靜態資源,但發現存取 404.

其實 src/main/resources/static 是存放靜態資源的目錄而不是url的存取目錄,你應該是對static目錄下資源進行設定過濾規則。

你可以這樣設定,下面的是shiro的靜態資源過濾設定,security的一樣,主要是哪些url路徑需要過濾。

// 圖片js檔案等過濾設定
filterRuleMap.put("/css/**", "anon");
filterRuleMap.put("/js/**", "anon");
filterRuleMap.put("/img/**", "anon");
filterRuleMap.put("/pages/**", "anon");
// 首頁過濾設定
filterRuleMap.put("/index.html", "anon");
filterRuleMap.put("/", "anon");

這樣就可以存取 靜態資源了,存取index.html了。

如果你發現要設定很多可以將原來所有檔案放入一個統一目錄myfiles下,對這個目錄進行過濾即可,如下圖所示:

filterRuleMap.put("/myfiles/**", "anon");
// 首頁過濾設定
filterRuleMap.put("/index.html", "anon");
filterRuleMap.put("/", "anon");

但這樣存取首頁時,URL路徑裡面就需要增加這個myfiles, localhost:8080/myfiles/index.html

一個笨的解決方法是可以增加一個額外的index.html頁面,直接跳轉/myfiles/index.html頁面即可。

<script>
    window.location.href = 'pages/index.html';
</script>

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com