靜態資源處處都是坑!明白原理才能繞過這些坑!css
在web.xml文件的配置中,四種路徑編寫方式優先級以下圖:html
其中b和d都能接收全部請求,僅僅是在優先級上有區別。web
d是優先級最低的,因此若是一個路徑有」人」要就不會執行到d,tomcat服務器(不管什麼服務器)有一個默認的請求處理方案:在tomcat服務器的配置文件: tomcat8\conf\web.xml中有一個默認的web配置文件,其中配置了jsp和default。spring
都配置了<load-on-startup>,因此這兩個默認請求處理會在tomcat啓動時進行加載。瀏覽器
從圖中能夠看出,jsp配置的url-pattern爲*.jsp和*.jspx,優先級高於/的優先級,因此當請求jsp頁面時,會由類JspServlet進行處理。tomcat
default配置爲在請求路徑匹配完其餘全部Servlet仍是沒有匹配到的狀況下,請求會被髮到default,由DefaultServlet進行處理,通常請求的靜態資源,無效路徑等等都會經過DefaultServlet進行處理。服務器
而在配置springmvc框架時,通常在web.xml中將DispatcherServlet映射路徑配置成/mvc
這樣配置會覆蓋掉tomcat配置的默認的default,而,DispatcherServlet沒有處理靜態資源的能力,因此會報錯或者須要在springmvc中進行關於靜態資源的配置。app
css、js、圖片、html等都是靜態資源框架
不使用springmvc框架,這些靜態資源請求都會由tomcat的默認的default進行處理。
若是配置的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/」/>
其中,*表明一級目錄,**表明多級目錄。
*.do的優先級高於/,不影響tomcat默認配置的default,因此DispatcherServlet處理不了的會交給tomcat默認default進行處理。
明確:在jsp或html頁面中若是有<link> <script><img>,瀏覽器都會自動發送請求。
這是一個隱藏很深的坑,編寫script時沒有寫完整,使用360瀏覽器(谷歌內核)測試還不報錯!!
正確編寫方式:
衆所周知,WEB-INF是被保護的目錄,不容許客戶端進行訪問,這裏就涉及兩個概念:
請求轉發 和 重定向
請求轉發會間接的由服務器去訪問WEB-INF,因此能夠訪問,
重定向請求靜態資源屬於客戶端進行請求,因此不能訪問靜態資源.