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

Java Web 靜態資源處理三大方案總結

     編輯:Java 程式設計入門

一、背景問題

Spring MVC DispatcherServlet 預設攔截所有請求(/ 或 *.do),導致靜態資源(CSS、JS、圖片)也進入 Spring 處理流程,造成 404 或效能浪費。需配置靜態資源直接由 Servlet 容器處理。

二、方案一:啟用容器預設 Servlet(最原始、效能最佳)

<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 先攔截。
  • 各容器預設 Servlet 名稱不同:Tomcat/Jetty/JBoss/GlassFish → default;WebLogic → FileServlet;WebSphere → SimpleFileServlet;Resin → resin-file;GAE → _ah_default。
  • 優點:繞過 Spring,效能最高;缺點:需逐一列舉副檔名,維護成本高。

三、方案二:Spring 3.0.4+ <mvc:resources>(推薦)

<mvc:resources mapping="/images/**" location="/images/" cache-period="31536000"/>
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/css/**" location="/css/"/>

屬性解析:

  • mapping:請求路徑模式,對應 ResourceHttpRequestHandler。
  • location:資源實際位置,支援 classpath:、file:、jar: 協定。
  • cache-period:秒數,啟用瀏覽器快取(HTTP Header Cache-Control)。

優點:支援 JAR 內資源、快取控制、路徑映射靈活;缺點:請求仍經 Spring HandlerMapping,略有效能開銷。

四、方案三:<mvc:default-servlet-handler/&code>(最簡潔)

<mvc:default-servlet-handler/>

原理:向容器預設 Servlet 轉發靜態資源請求。自動註冊 SimpleUrlHandlerMapping (order=Integer.MAX_VALUE) + DefaultServletHttpRequestHandler。

優點:零配置映射副檔名;缺點:同樣經 Spring 處理鏈,且若有全域攔截器需自行排除靜態路徑。

五、HandlerMapping 執行順序與效能

HandlerMappingOrder 值說明
DefaultAnnotationHandlerMapping0最優先,處理 @Controller
<mvc:resources> 產生2147483646靜態資源映射
<mvc:default-servlet-handler> 產生2147483647兜底轉發容器預設 Servlet

請求先嘗試 Controller 映射 → 失敗才落入靜態資源處理。若靜態資源量大,建議方案一或 Nginx 直接代理。

六、攔截器陷阱與解決

方案二、三的請求會通過 HandlerInterceptor。若攔截器做權限檢查,需排除靜態路徑:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/images/**"/>
        <mvc:exclude-mapping path="/js/**"/>
        <mvc:exclude-mapping path="/css/**"/>
        <bean class="com.example.AuthInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

或在攔截器內判斷 request.getRequestURI() 開頭路徑直接 true 放行。

七、最佳實踐建議

  1. 生產環境:Nginx/Apache 直接服務靜態檔,Spring Boot 只處理動態 API。
  2. 開發/測試:<mvc:resources> 靈活且支援 JAR 內資源。
  3. 舊專案遷移:<mvc:default-servlet-handler/> 最省事。
  4. DispatcherServlet 映射:建議用 *.do 或 /api/* 避開靜態資源衝突。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved