记录一次SpringMVC项目静态资源访问问题

最近一直都是在用springboot搭建项目,项目一般都是前后端分离,当然也不用担心静态资源访问的问题,恰好有朋友问到springMVC项目中页面中引入css、js等静态资源无法访问的问题,刚好抽时间来把问题给还原一下,顺便记录一下解决问题的过程

本文目录

  • 场景还原
  • 问题分析
  • 解决方案

场景还原

首先,通过eclipse搭建一个maven项目,转成web工程,项目工程结构如下:


在本项目中,将页面、以及静态资源css、images等都放到resources目录下的templates目录下,在页面hellpspring.jsp中引入静态资源,项目使用tomcat启动,然后通过浏览器访问http://localhost:8080/resourceVisit/hello,效果如下,出现了资源找不到的错误

在后台控制台会报错,报错日志信息为:

问题分析

根据页面报错的信息来看,静态资源访问不到,通过后台控制台的日志来看,我们的css和images等静态资源也会被dispatchServlet拦截处理,这是由于我们在web.xml中配置了

  <servlet-mapping>
      <servlet-name>dispatcher</servlet-name>
<!-- “/” 对所有链接都拦截,所以静态资源的链接也被拦截了 -->
      <url-pattern>/</url-pattern>
  </servlet-mapping>

解决方案:

1.通过激活Tomcat的defaultServlet来处理静态文件:

在web.xml中对不需要拦截的都需要配置一下,注意要写在DispatcherServlet的前面, 让defaultServlet先拦截,这个就不会进入Spring了

<servlet-mapping>
     <servlet-name>default</servlet-name>
     <url-pattern>*.png</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>

设置好之后,重启tomcat服务
打开浏览器再次访问,http://localhost:8080/resourceVisit/hello


发现页面还是同样的错误,不过后台控制台没有日志报错,说明静态资源没有被dispatchServlet拦截,设置生效了,那为什么还是访问不到静态资源呢?

继续分析,我们查看一下项目部署打包的路径,右击项目选中properties,找到Deployment Assembly,如下图:


我们发现,项目对应的resource目录的内容都被打包到了WEB-INF/classess目录下去了,其中WEB-INF这个目录比较特殊,做为WEB应用的安全目录存在。Servlet规范是对此也有要求:

A special directory exists within the application hierarchy named “WEB-INF”. This directory contains all things related to the application that aren’t in the document root of the application.

即所有与应用相关的,但又不能放到根目录下的文件可以放在这里。
包含的内容大致有以下几类:

  • web.xml
  • 对于servlet 3.0,支持其web-fragment.xml的声明。
  • classes目录,用于存放所有编译过的应用的class文件
  • lib目录,存放应用依赖的,第三方的jar文件。

对于WEB-INF目录的访问,规范中有如下约束:

The Web application class loader must load classes from the WEB-INF/classes directory first, and then from library JARs in the WEB-INF/lib directory. Also, except for the case where static resources are packaged in JAR files, any >requests from the client to access the resources in WEB-INF/ directory must be >returned with a SC_NOT_FOUND(404) response.

所以我们在页面中引用css、images会有了如上的错误,我们只需要把静态资源目录放到和WEB-INF同级目录即可,调整后的工程目录如图:


再次访问,http://localhost:8080/resourceVisit/hello,发现资源可以正常访问,问题解决

2.使用MVC的default-servlet-handler解决

在Spring配置文件 springContext.xml 增加以下配置即可:

<!-- 配置mvc注解驱动 -->
<mvc:annotation-driven />
<!-- 配置default-servlet-handler -->
<mvc:default-servlet-handler/>

注意:使用这种方式的前提和第一种方法一样,要求相关的静态资源文件要放到WEB-INF的同级目录下

3.在spring3.0.4以后版本提供了mvc:resources

只需在srping配置文件springContext.xml中配置静态资源的映射即可,配置如下:

    <mvc:resources mapping="/images/**" location="/WEB-INF/classes/templates/images/"/>
      <!-- 使用classpath路径 -->
    <mvc:resources mapping="/css/**" location="classpath:/templates/css/"/>

mapping是指定要处理的映射
location对应项目发布的资源文件目录
classpath是指 WEB-INF文件夹下的classes目录
使用此种方式,不要求静态资源放在WEB-INF同级目录
注意:如果访问出现错误警告: No mapping found for HTTP request with URI [/resourceVisit/hello] in DispatcherServlet with name 'dispatcher',可能是因为没有配置<mvc:annotation-driven />的原因

总结

建议项目从开始设计时,把静态资源以及页面文件放到WEB-INF的同级目录,这样只需要用方案1方案2即可解决静态资源文件的访问问题,如果项目已经定型,不想更换目录的话,用方案3的方式去解决静态资源访问问题

参考:

  1. WEB-INF目录知多少
  2. javaweb应用程序的规范目录结构
  3. 工程git项目地址
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,295评论 1 92
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,717评论 6 342
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,813评论 0 5
  • 20出头,话说是年轻的年纪,但是随着生活中所经理过得事情,并非还有一颗年轻的心。 高中毕业没毕业...
    Double_int阅读 188评论 0 0