静态资源处处都是坑!明白原理才能绕过这些坑!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,因此能够访问,
重定向请求静态资源属于客户端进行请求,因此不能访问静态资源.