初学SpringMVC之静态资源被拦截问题

初学SpringMVC难免会遇到很多问题,令人费解,就比如静态资源被拦截导致报错:在这里插入图片描述
显示jQuery资源不存在的404错误。网上查找一番后,知道了原因以及处理方法整理如下:

静态资源为什么会被拦截

在一个使用springmvc的web项目中,必然在web.xml中要配置前端控制器DispatcherServlet
当我们将web应用部署到tomcat服务器上,服务器是先加载全局的web.xml,即"D:\apache-tomcat-8.5.50\conf\web.xml"这是tomcat自带的web.xml文件,然后才会加载我们自己web项目中的web.xml,当我们加url-pattern配置成<url-pattern>/</url-pattern>这样时,会覆盖掉全局web.xml中对于静态资源的处理,
这是tomcat的全局web.xml

  <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- The mapping for the default servlet -->
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

这就是默认的servlet,其中<url_pattern>和我们的一样,导致静态资源也被我们自定义的dispatcherServlet所拦截,那这个类就会去找controller里面的映射了,比如我们访问http://localhost:8080/springmvc/js/jQuery-1.8.3.js,显然我们的Controller里面是没有这个映射路径的。这就导致出现404错误。

我们项目的web.xml

<servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/springMVC-config2.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <url-pattern>/</url-pattern>   <!-- 注意这里--!>
  </servlet-mapping>

其中url-pattern:

url-pattern有5种配置模式:

(1)/xxx :完全匹配/xxx的路径

(2)/xxx/* :匹配以/xxx开头的路径,请求中必须包含xxx。

(3)/* :匹配/下的所有路径,请求可以进入到action或controller,但是转发jsp时再次被拦截,不能访问jsp界面。

(4).xx :匹配以xx结尾的路径,所有请求必须以.xx结尾,但不会影响访问静态文件。

   (5) / :默认模式,未被匹配的路径都将映射到servlet,对jpg,js,css等静态文件也将被拦截,不能访问。

解决方法

如果我们用了 / 的方式,那么就需要补上以下配置让静态资源可被访问:
方式一: 在web.xml中添加如下

<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>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>

...
...

等等。。。。

其他地方保持不变,这个粒度显然是比/更小的,它会将*.jpg文件交给servlet-name为default的servlet去处理该请求,默认的servlet为什么就没有拦截了呢?因为它是直接访问。

当然不好的地方是,如果你需要拦截*.html又得配一个,所以比较麻烦。一般不采用。

方式二:在我们的spring-mvc.xml中配置如下

先需要开启mvc的配置
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="...
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"

然后添加如下

<mvc:default-servlet-handler />
<!--使用默认的servlet处理静态资源,类似方法一 --!>

方法三:在我们的spring-mvc.xml中配置如下

<!-- 设置静态资源不过滤 -->
<!--  /css/** 两个*是表示这个文件及里面的子文件夹,如果一个*就不包含这个目录里面的子文件夹。-->
    <mvc:resources location="/css/" mapping="/css/**" />
    <mvc:resources location="/img/" mapping="/img/**" />
    <mvc:resources location="/js/" mapping="/js/**" />

这种方式更灵活,功能更丰富。

注意 spring-mvc.xml中这个配置<mvc:annotation-driven />推荐每次都加
功能为开启mvc注解驱动,即开启mvc组件

以上就是我整理的SpringMVC静态资源被拦截的解决方法,作为一名初学者,我会一直认真学习,虚心求教,也会把我所遇到的问题和解决方法整理出来和大家分享,如有不足之处欢迎指教。让我们一起努力!!!

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值