首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Web 靜態資源處理三大方案深度對比:defaultServlet、mvc:resources、default-servlet-handler

     編輯:Java 相關知識

靜態資源處理的核心矛盾

DispatcherServlet 攔截所有請求(/ 或 /*)導致靜態資源(JS、CSS、圖片)也進入 Spring MVC 流程,造成:

  • 性能損耗:經過攔截器、HandlerMapping、HandlerAdapter 全鏈路
  • 404 錯誤:無對應 Controller 處理靜態文件請求
  • 配置複雜:需排除靜態路徑或單獨映射

方案一:啟用容器默認 Servlet(最原生、最高性能)

原理

各 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 鏈路。

方案二:Spring MVC 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)

優勢:

  • 支持 JAR 包內靜態資源(打包分發友好)
  • 支持 ResourceResolver 鏈(版本號、壓縮、主題切換)
  • 聲明式配置,無需修改 web.xml

方案三: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) 可選

HandlerMapping 優先級陷阱

Spring 根據 order 屬性決定處理器映射順序:

  • RequestMappingHandlerMapping:order=0(最高優先級)
  • mvc:resources 註冊的 SimpleUrlHandlerMapping:order=2147483646
  • default-servlet-handler 註冊的 SimpleUrlHandlerMapping:order=2147483647

請求先嘗試 Controller 映射,失敗後才走靜態資源處理。若 Controller 捕獲 /** 會導致靜態資源 404。

最佳實踐建議

  1. Spring Boot 專案:直接放資源到 src/main/resources/static 或 public,零配置生效
  2. 傳統 Spring MVC:優先使用 mvc:resources,配置 cache-period 開啟瀏覽器緩存
  3. 高性能靜態服務:Nginx 反向代理直接服務靜態文件,location /static { alias /app/static; expires 1y; }
  4. 權限攔截器注意:排除靜態資源路徑 excludePathPatterns("/static/**", "/images/**")
  5. DispatcherServlet 映射:推薦 *.do、/api/* 等帶後綴,避免 / 或 /* 衝突

合理配置靜態資源處理,不僅解決 404 問題,更能大幅提升首屏加載速度,優化用戶體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved