Spring MVC设置不拦截静态资源


Spring MVC设置不拦截静态资源

一、前言

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!



发表评论

电子邮件地址不会被公开。 必填项已用*标注