• 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 : 映射的路径

      

  • 相关阅读:
    java编程思想-接口总结
    java编程思想-复用类总结
    oracle dos命令
    循环插入记录,id每次加1
    android studio 的Error:No such property: packageApplicationTask for class: com.android.build.gradle.internal.variant.ApkVariantOutputData解决方法
    AngularJS 初学笔记(理论基础)
    在Linux添加PYTHONPATH方法以及修改环境变量方法
    基于Redis的三种分布式爬虫策略
    函数指针 如:void (*oper)(ChainBinTreee *p)
    typedef struct 使用
  • 原文地址:https://www.cnblogs.com/jinyu59/p/10706263.html
Copyright © 2020-2023  润新知