spring MVC设置不拦截静态资源

问题产生:
因为我们在web.xml中写了 拦截所有请求,

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

这其中自然包括了静态资源,所以页面需要引用css、js、img的话,该请求也会被拦截。

运行项目访问index.jsp页面会报404错误,这是因为被DispatcherServlet拦截了

解决办法:
方案一:拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml)
注意:需引入mvc命名空间

<!-- 添加注解驱动 -->
 <mvc:annotation-driven/>
 <!--通过mvc:resources设置静态资源,这样servlet就会处理这些静态资源,而不通过控制器
 设置不过滤内容,比如:css,js,img 等资源文件
 location指的是本地路径,mapping指的是映射到的虚拟路径。
 -->
<!-- 设置静态资源不过滤 -->
    <mvc:resources location="/css/" mapping="/css/**" />
    <mvc:resources location="/img/" mapping="/img/**" />
    <mvc:resources location="/js/" mapping="/js/**" />
    <mvc:resources location="/plugins/" mapping="/plugins/**" />

方案二:使用默认的servlet处理静态资源(涉及spring-mvc.xml,web.xml)
在spring-mvc.xml中添加:

<!--启用默认Servlet-->
 <mvc:default-servlet-handler/>

mvc:default-servlet-handler/ 这个,点击打开这个可以看到如下信息:

这里面有两个信息非常重要:第一是default Servlet,这个指的是容器默认的Servlet,其实就是tomcat默认的Servlet;第二:路径的转换,我们可以看出是转换到/的路径;

/的路径指的是webapp的路径(此处一定注意不是WEB-INF,WEB-INF路径的访问是受权限控制的,tomcat维护权限)。这样配置的意思就是说所有的按照规则访问静态资源的请求都会匹配到对应的webapp下的路径:

在web.xml中添加:

<!--增加对静态资源的处理,当前的设置必须在Spring的Dispatcher的前面-->
 <servlet-mapping>
 <servlet-name>default</servlet-name>
 <url-pattern>*.css</url-pattern>
 <url-pattern>/css/*</url-pattern>
 </servlet-mapping>

而这个标签起作用的前提就是需要我们把静态资源放在webapp下,而非WEB-INF下,否则还是会无效

方案三:修改spring的全局拦截设置为.do的拦截(涉及web.xml)*

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

这时,我们浏览器的所有访问路径就要变成:http://localhost:8080/xxx/xxx.do

比较总结:
第一种方案配置比较臃肿,多个拦截器时增加文件行数,不推荐使用
第二种方案使用默认的Servlet进行资源文件的访问,Spring拦截所有请求,然后再将资源文件交由默认的Sevlet进行处理,性能上少有损耗
第三种方案Spring只是处理以’.do’结尾的访问,性能上更加高效,但是再访问路径上必须都以’.do’结尾,URL不太文雅

综上所述,推荐使用第二和第三种方案

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值