一、前言
Spring MVC 下的 WEB 项目,会配置 Servlet 为DispatcherServlet,设置拦截 url 一般为/,如下 web.xml 配置:
<!-- Spring MVC servlet --> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> <!--表示启动容器时初始化该 Servlet --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <!-- 拦截所有请求 --> <url-pattern>/</url-pattern> </servlet-mapping>
这样,静态资源也会被 DispatcherServlet 拦截导致不能访问(404),可以通过以下四种对静态资源放行。
二、静态资源放行四种方式
1、web.xml 中设置 default Servlet
<!-- 允许访问以 html、css、js 为结尾的静态资源,有其他静态静态资源(如.jpg、.md、.mp3 等)需要放行,后面追加即可 --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping>
其实就是将设置的静态资源重新交由 default Servlet(如果 WEB 容器是 Tomcat,其实就是 tomcat 的默认 Servlet)去处理。
可以看到每一种后缀的静态资源都需要配置一次,所以这种方式是比较臃肿的。
2、Spring MVC 配置文件中配置 mvc:resources
<!-- 设置不拦截资源,如:css,js,img 等;mapping 指的是请求的 Url 路径。location 指的是本地的真实路径,--> <mvc:resources mapping="/html/**" location="/html/"/> <mvc:resources mapping="/css/**" location="/css/"/>
这种方式也需要根据放行的资源目录,配置多条。
3、 Spring MVC 配置文件中配置 mvc:default-servlet-handler
<!--将静态资源交由默认的 servlet 处理--> <mvc:default-servlet-handler />
这一条就够了,这样所有的静态资源全部走默认 Servlet。
4、web.xml 配置 url 拦截加后缀
<url-pattern>*.do</url-pattern>
这其实是 Hibernate 对应的 url 配置习惯,这样浏览器访问路径就成了:http://localhost:8080/xxx/xxx.do
这就需要在编写 RequestMapping 时都加上.do后缀,浏览器访问也要加上,这不符合 Spring MVC 的编程习惯。
以上就是 Spring MVC 不拦截静态资源的四种方式。over!