DispatcherServlet 攔截所有請求(/ 或 /*)導致靜態資源(JS、CSS、圖片)也進入 Spring MVC 流程,造成:
各 Servlet 容器內置默認 Servlet 處理靜態資源,名稱各異:
| 容器 | 默認 Servlet 名稱 |
|---|---|
| Tomcat / Jetty / JBoss / GlassFish | default |
| Google App Engine | _ah_default |
| Resin | resin-file |
| WebLogic | FileServlet |
| WebSphere | SimpleFileServlet |
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
關鍵點:必須配置在 DispatcherServlet 之後,讓 defaultServlet 先攔截靜態請求,避免進入 Spring 鏈路。
mvc:resources(推薦、功能最豐富)<mvc:resources mapping="/images/**" location="/images/" cache-period="31536000" />
<mvc:resources mapping="/static/**" location="classpath:/static/" />
核心屬性:
mapping:請求路徑模式(Ant 風格)location:資源實際位置(支持 classpath:、file:、jar:)cache-period:瀏覽器緩存秒數(Cache-Control: max-age=xxx)優勢:
mvc:default-servlet-handler(最簡單、自動轉發)<mvc:default-servlet-handler />
原理:註冊 DefaultServletHttpRequestHandler 到 SimpleUrlHandlerMapping,映射 /**,將靜態請求轉發給容器默認 Servlet。
| 維度 | defaultServlet (web.xml) | mvc:resources | default-servlet-handler |
|---|---|---|---|
| 性能 | ★★★★★ (容器原生) | ★★★★☆ (Spring 處理) | ★★★★☆ (轉發開銷) |
| 配置複雜度 | 高 (需逐個擴展名) | 低 (Ant 模式匹配) | 極低 (一行配置) |
| JAR 包資源 | 不支持 | 支持 | 依賴容器實現 |
| 緩存控制 | 容器配置 | cache-period 精確控制 | 容器配置 |
| 版本號/壓縮 | 不支持 | 支持 (ResourceResolver) | 不支持 |
| 攔截器影響 | 無 (繞過 Spring) | 會經過攔截器 | 會經過攔截器 |
| Spring Boot 默認 | 否 | 是 (WebMvcAutoConfiguration) | 可選 |
Spring 根據 order 屬性決定處理器映射順序:
RequestMappingHandlerMapping:order=0(最高優先級)mvc:resources 註冊的 SimpleUrlHandlerMapping:order=2147483646default-servlet-handler 註冊的 SimpleUrlHandlerMapping:order=2147483647請求先嘗試 Controller 映射,失敗後才走靜態資源處理。若 Controller 捕獲 /** 會導致靜態資源 404。
src/main/resources/static 或 public,零配置生效mvc:resources,配置 cache-period 開啟瀏覽器緩存location /static { alias /app/static; expires 1y; }excludePathPatterns("/static/**", "/images/**")*.do、/api/* 等帶後綴,避免 / 或 /* 衝突合理配置靜態資源處理,不僅解決 404 問題,更能大幅提升首屏加載速度,優化用戶體驗。