靜態資源到處都是坑!明白原理才能繞過這些坑!
web.xml配置servlet中四種路徑的區別
在web.xml文件的配置中,四種路徑編寫方式優先級如下圖:
其中b和d都能接收所有請求,僅僅是在優先級上有區別。
d是優先級最低的,所以如果一個路徑有”人”要就不會執行到d,tomcat服務器(無論什么服務器)有一個默認的請求處理方案:在tomcat服務器的配置文件: tomcat8\conf\web.xml中有一個默認的web配置文件,其中配置了jsp和default。
都配置了<load-on-startup>,所以這兩個默認請求處理會在tomcat啟動時進行加載。
從圖中可以看出,jsp配置的url-pattern為*.jsp和*.jspx,優先級高於/的優先級,所以當請求jsp頁面時,會由類JspServlet進行處理。
default配置為在請求路徑匹配完其他所有Servlet還是沒有匹配到的情況下,請求會被發到default,由DefaultServlet進行處理,一般請求的靜態資源,無效路徑等等都會通過DefaultServlet進行處理。
而在配置springmvc框架時,一般在web.xml中將DispatcherServlet映射路徑配置成/
這樣配置會覆蓋掉tomcat配置的默認的default,而,DispatcherServlet沒有處理靜態資源的能力,所以會報錯或者需要在springmvc中進行關於靜態資源的配置。
什么是靜態資源?
css、js、圖片、html等都是靜態資源
放行靜態資源
不使用springmvc框架分析
不使用springmvc框架,這些靜態資源請求都會由tomcat的默認的default進行處理。
使用了springmvc框架分析
如果配置的DispatcherServlet的映射路徑不為/時,對靜態資源的請求最終會由tomcat的默認配置來處理,所以不影響靜態資源的正常訪問。
如果配置的DispatcherServlet的映射路徑為/時,會覆蓋掉tomcat的默認的default配置,所以需要在springmvc文件中進行配置,對靜態資源進行放行。
放行靜態資源的三種方式:
方式一:最簡單(推薦)
spring mvc配置文件中加入以下內容:
在springmvc文件中配置上<mvc:default-servlet-handler/>,發出靜態資源請求后,請求傳到DispatcherServlet,DispatcherServlet調用RequestMappingHandlerMapping進行映射匹配,匹配不成功,DispatcherServlet最終會將請求轉交給tomcat默認default進行處理。
方式二:更加靈活
在springmvc配置文件中配置
<mvc:resources mapping=”/css/**” location=”/css/”/>
其中,*代表一級目錄,**代表多級目錄。
方式三:修改DispatcherServlet的映射規則
*.do的優先級高於/,不影響tomcat默認配置的default,所以DispatcherServlet處理不了的會交給tomcat默認default進行處理。
明確:在jsp或html頁面中如果有<link> <script><img>,瀏覽器都會自動發送請求。
其他請求不到靜態資源的可能原因
一.jsp或者html界面引用js文件錯誤
這是一個隱藏很深的坑,編寫script時沒有寫完整,使用360瀏覽器(谷歌內核)測試還不報錯!!
正確編寫方式:
二.在WEB-INF目錄下的靜態資源只有服務器能訪問,客戶端無法直接訪問
眾所周知,WEB-INF是被保護的目錄,不允許客戶端進行訪問,這里就涉及兩個概念:
請求轉發 和 重定向
請求轉發會間接的由服務器去訪問WEB-INF,所以可以訪問,
重定向請求靜態資源屬於客戶端進行請求,所以不能訪問靜態資源.