SpringMVC學習筆記9-靜態資源對映

過期小朋友、發表於2020-12-14

九、 靜態資源對映

當在 DispatcherServlet 的中配置攔截 “/” 時,除了*.jsp 不會攔截以外,其 他所有的請求都會經過前端控制器進行匹配,此時靜態資源,例如 .css、.js、*.jpg…… 就 會被前端控制器攔截,導致不能訪問,出現 404 問題。
在這裡插入圖片描述
訪問web目錄下untitled.png失敗。因為使用DispatcherServlet,配置urlParterrn為/只會過濾jsp,那其他的會攔截,然後找Controller去呼叫請求處理。因為沒有寫,所以報錯404.

1 通過 DefaultServlet 處理靜態資源
tomcat軟體自己帶有一個web.xml,裡面有一個DefaultServlet,如果配置了對映.css,.jpg,.png等,那麼當請求這些資源的時候會由DefaultServlet處理,直接放行!
tomcat自有的web.xml
在這裡插入圖片描述修改專案的web.xml

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
</servlet-mapping>

重新啟動tomcat,訪問web目錄下的untitled.png圖片,訪問成功!
在這裡插入圖片描述
這樣做可以訪問到web直接子節點,這些靜態檔案。嘗試訪問web子目錄的WEB-INF/下的靜態檔案,會經過預設的Servlet放行,但是因為WEB-INF目錄訪問受限,仍會報錯404
在這裡插入圖片描述

2 通過 SpringMVC 的靜態資源對映器處理靜態資源

在 spring3.0.4 以後的 SpringMVC 模組提供了靜態資源對映器元件。通過 mvc:resources 標籤配置靜態資源對映器 。請求會先到DispatcherServlet,發現url是靜態資源配置了的路徑,會直接去位置中找訪問的資源。
修改 SpringMVC 配置檔案

<mvc:resources mapping="/image/**" location="/WEB-INF/image/"/>

訪問結果
可以訪問到任意目錄下的靜態檔案。使用的是springmvc不是tomcat的。
在這裡插入圖片描述

3 通過<mvc:default-servlet-handler />處理靜態資源

在 SpringMVC 的配置檔案中配置<mvc:default-servlet-handler />後,會在 Spring MVC 上 下文中定義一個 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler, 它會像一個檢查員,對進入 DispatcherServlet 的 URL 進行篩查,如果發現是靜態資源的請求,就將該請求轉由 Web 應用伺服器預設的 Servlet 處理,如果不是靜態資源的請求,才由 DispatcherServlet 繼續處理。
修改 SpringMVC 配置檔案

<mvc:default-servlet-handler/>

傳送3個請求,1,2是走的預設的DefaultServlet,放行靜態資源,如果是WEB-INF目錄,則訪問受限。
3走的是springmvc的Servlet,根據url選擇控制器。返回ok頁面。

在這裡插入圖片描述總結:
對於靜態資源的訪問有三種方式。第一種換用tomcat的DefaultServlet處理靜態資源,直接放行。所有放在web目錄下的直接靜態資源可被訪問。WEB-INF目錄下的不能訪問,會報404.
第二種配置springmvc的靜態資源對映器,mappint是配置請求的url,location是配置對映路徑。可以訪問任意目錄下的靜態資源!
第三種配置DefaultServleHtttpRequestHandler,如果是靜態資源走DeafultServlet,不是,走DispatcherServlet。那麼仍然不能訪問WEB-INF目錄下靜態資源。

所以,使用時我會選擇使用在springmvc配置檔案中配置靜態資源對映器,去訪問靜態資源。

相關文章