REST风格下如何放行静态资源

在配置DispatcherServlet(前端控制器)时,如果把拦截路径配置成rest风格(即斜杠/),则会将静态资源也一并拦截(比如.css .js ,jpg)为了避免这个情况,可以把拦截路径设置成*.do, *.action, *.html等等

<!-- 配置前端控制器 -->
<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:springMVC.xml</param-value>
      </init-param>
  </servlet>
 
  <servlet-mapping>
      <servlet-name>springMVC</servlet-name>
        <!-- 错误配置 : /* 这样配置的话,静态资源(css,js,图片等)会被DispatcherServlet拦截,会因为找不到对应的Handler而报错 -->
     <!-- 其他配置 : *.action 匹配以.action结尾的请求 -->
      <url-pattern>/</url-pattern>
  </servlet-mapping>

<url-pattern>是将符合条件的请求路径拦截,然后与DispatcherServlet内的路径匹配,静态资源的路径不在DispatcherServlet内,所以会报404

但是,确实想要使用rest风格的话,应该怎么避免静态资源被拦截呢?

方法一 : 激活Tomcat的defaultServlet来处理静态文件

1 <servlet-mapping>
2     <servlet-name>default</servlet-name>
3     <url-pattern>*.jpg</url-pattern>
4 </servlet-mapping>
5 <servlet-mapping>
6     <servlet-name>default</servlet-name>
7     <url-pattern>*.js</url-pattern>
8 </servlet-mapping>
9 <servlet-mapping>

  需要写在前端控制器前,让defaultServlet先拦截.每种类型的文件都要单独写一个<servlet-mapping>

  Tomcat的默认servlet名字是default,所以<servlet-name>标签内写default.

方法二 : 使用<mvc:default-servlet-handler />

  在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler

  如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理

  如果使用的web应用服务器的默认servlet名称不是default,那么需要再配置default-servlet-name属性,如下

 1 <mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" /> 

方法三 : 使用<mvc:resources />

 1 <mvc:resources location="/,classpath:/META-INF/publicResources/" mapping="/resources/**"/> 

  会由Spring MVC框架自己处理静态资源,而不是把静态资源的处理交给web应用服务器处理.

  <mvc:resources />允许把静态资源放在任何地方,比如WEB-INF目录下,类路径下,(正常情况下是不可以放在这些位置的,传统web容器的静态资源只能放在web容器的根路径下)甚至可以把静态文件打包到jar中.

  location : 文件真实的路径,是Resources类型的属性,因此可以使用诸如"classpath:"等的资源前缀指定资源位置

  mapping : 映射的路径

  

原文地址:https://www.cnblogs.com/jinyu59/p/10706263.html