訪問工程目錄中的圖片報錯404


前提是圖片目錄已經放倒了WEB-INF外面,仍然是報錯404,如果是jsp資源,卻可以正確的解析。后來發現是spring mvc配置文件導致的。

,在配置文件中加上了

<mvc:default-servlet-handler />

再訪問就不再報錯了。

樓主查了一下這個配置的作用。

 

servlet在找頁面時,走的是dispatcherServlet路線。找不到的時候會報404

加上這個默認的servlet時候,servlet在找不到的時候會去找靜態的內容。

 

如何你的DispatcherServlet攔截 *.do這樣的URL,就不存在訪問不到靜態資源的問題。如果你的DispatcherServlet攔截“/”,攔截了所有的請求,同時對*.js,*.jpg的訪問也就被攔截了。

目的:可以正常訪問靜態文件,不要找不到靜態文件報404。

 

方案一:激活Tomcat的defaultServlet來處理靜態文件

 

 <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了 


Tomcat, Jetty, JBoss, and GlassFish  默認 Servlet的名字 -- "default"
Google App Engine 默認 Servlet的名字 -- "_ah_default"
Resin 默認 Servlet的名字 -- "resin-file"
WebLogic 默認 Servlet的名字  -- "FileServlet"
WebSphere  默認 Servlet的名字 -- "SimpleFileServlet" 

 

方案二 ,使用<mvc:default-servlet-handler/>

 

會把"/**" url,注冊到SimpleUrlHandlerMapping的urlMap中,把對靜態資源的訪問由HandlerMapping轉到 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler 處理並返回.DefaultServletHttpRequestHandler使用就是各個Servlet容器自己的默認Servlet.

 

 

 

補充說明:多個HandlerMapping的執行順序問題:

 

DefaultAnnotationHandlerMapping的order屬性值是:0
<mvc:resources/ >自動注冊的 SimpleUrlHandlerMapping的order屬性值是: 2147483646

 

<mvc:default-servlet-handler/>自動注冊 的SimpleUrlHandlerMapping 的order屬性值是: 2147483647

 

spring會先執行 order值比較小的。當訪問一個a.jpg圖片文件時,先通過 DefaultAnnotationHandlerMapping 來找處理器,一定是 找不到的,我們沒有叫a.jpg的Action。再按order值升序找,由於最后一個 SimpleUrlHandlerMapping 是 匹 "/**"的,所以一定會匹配上,再響應圖片。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM