关于SpringMVC中静态资源的放行
如果在web.xml中配置DispatcherServlet时配置的url-pattern为 / 时,代表所有请求都交由spring容器管理
,动态资源能通过Controller中的请求映射requestMapping来实现请求管理,而静态资源则需要进行静态放行
大概意思是默认 Servlet 的 RequestDispatcher 必须通过名称而不是路径来检索。 换句话说就是 Spring MVC 将接收到的所有请求都看作是一个普通的请求,包括对于静态资源的请求。这样以来,所有对于静态资源的请求都会被看作是一个普通的后台控制器请求,导致请求找不到而报 404 异常错误。查看 tomcat 的日志会报一个警告:
<!--配置SpringMVC前端控制器,对浏览器请求进行统一处理-->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置springMVC配置文件的位置和名称-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<!--将前端控制器DispatcherServlet的初始化时间提前到服务器启动时-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
放行的两种方法
-
在SpringMVC.xml配置中添加如下配置
<mvc:resources mapping="/static/**" location="/static/"/>
mapping表示请求url中带有static及后续路径的就会被处理
location表示具体静态资源的项目路径
-
在SpringMVC.xml配置中添加如下配置
<mvc:default-servlet-handler/>
在 WEB 容器启动的时候会在上下文中定义一个 DefaultServletHttpRequestHandler,它会对DispatcherServlet的请求进行处理,如果该请求已经作了映射,那么会接着交给后台对应的处理程序,如果没有作映射,就交给 WEB 应用服务器默认的 Servlet 处理,从而找到对应的静态资源,只有再找不到资源时才会报错。
一般 WEB 应用服务器默认的 Servlet 都是 default。如果默认 Servlet 用不同名称自定义配置,或者在缺省 Servlet 名称未知的情况下使用了不同的 Servlet 容器,则必须显式提供默认 Servlet 的名称,如下:
<mvc:default-servlet-handler default-servlet-name="myCustomDefaultServlet"/>