完美解决SpringMVC中静态资源无法找到(No mapping found for HTTP request with URI)问题

今天遇到一个比较新奇的问题,但是也应该是使用spring MVC框架时由于疏忽经常会遇到的一个,解决后写出来和大家分享分享。


问题描述:项目正常启动,可以访问页面,但是无法找到静态资源文件,如css,js等文件资源。

浏览器控制台报错信息:


idea后台报错信息:


[java]  view plain  copy
  1. 二月 072017 11:27:35 上午 org.springframework.web.servlet.PageNotFound noHandlerFound  
  2. 警告: No mapping found for HTTP request with URI [/myboss-web/js/jquery-1.8.3.js] in DispatcherServlet with name 'mvc-dispatcher'  
  3. 二月 072017 11:27:35 上午 org.springframework.web.servlet.PageNotFound noHandlerFound  
  4. 警告: No mapping found for HTTP request with URI [/myboss-web/js/fun.base.js] in DispatcherServlet with name 'mvc-dispatcher'  

因为项目使用了spring security,之前我一度怀疑是不是没有给静态文件设置访问权限,后来确认了已经设置了访问静态资源无需权限认证,也检查了mvc拦截器的配置信息,没发现什么明显异常,之后就纳闷了。去网上查阅了一些资料后发现,确实是mvc拦截器在作祟。


我之前的拦截器配置信息:

[html]  view plain  copy
  1. <!--配置拦截器-->  
  2. <servlet>  
  3.   <servlet-name>mvc-dispatcher</servlet-name>  
  4.   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  5.   <init-param>  
  6.     <param-name>contextConfigLocation</param-name>  
  7.     <param-value>classpath*:/spring/applicationContext-mvc.xml</param-value>  
  8.   </init-param>  
  9.   <load-on-startup>1</load-on-startup>  
  10. </servlet>  
  11. <servlet-mapping>  
  12.   <servlet-name>mvc-dispatcher</servlet-name>  
  13.   <url-pattern>/</url-pattern>  
  14. </servlet-mapping>  


从配置上分析,如此配置会把所有的请求都会进行拦截,交给spring去处理。而spring所有请求的URL都是在controller中使用注解@RequestMapping标明,所以这样的情况下访问静态资源是访问不到的。

以下给出三种解决方案,自行选择使用

方法1:简单粗暴地告诉服务器,这些资源不需要拦截!

直接在web.xml文件中进行配置,如下:

[html]  view plain  copy
  1. <servlet-mapping>  
  2.    <servlet-name>default</servlet-name>  
  3.    <url-pattern>*.css</url-pattern>  
  4.  </servlet-mapping>  
  5.  <servlet-mapping>  
  6.    <servlet-name>default</servlet-name>  
  7.    <url-pattern>*.xml</url-pattern>  
  8.  </servlet-mapping>  
  9.  <servlet-mapping>  
  10.    <servlet-name>default</servlet-name>  
  11.    <url-pattern>*.swf</url-pattern>  
  12.  </servlet-mapping>  
  13.  <servlet-mapping>  
  14.    <servlet-name>default</servlet-name>  
  15.    <url-pattern>*.zip</url-pattern>  
  16.  </servlet-mapping>  
  17.  <servlet-mapping>  
  18.    <servlet-name>default</servlet-name>  
  19.    <url-pattern>*.gif</url-pattern>  
  20.  </servlet-mapping>  
  21.   
  22.  <servlet-mapping>  
  23.    <servlet-name>default</servlet-name>  
  24.    <url-pattern>*.jpg</url-pattern>  
  25.  </servlet-mapping>  
  26.  <servlet-mapping>  
  27.    <servlet-name>default</servlet-name>  
  28.    <url-pattern>*.png</url-pattern>  
  29.  </servlet-mapping>  
  30.  <servlet-mapping>  
  31.    <servlet-name>default</servlet-name>  
  32.    <url-pattern>*.js</url-pattern>  
  33.  </servlet-mapping>  

如果你嫌这样太麻烦,太low的话,请移步下面两种方法!


方法2:直接告诉spring,这个你就得这么做!

在MVC配置文件中添加资源文件映射。

  <resources mapping="/resources/**" location="/resources/" />
  <resources mapping="/images/**" location="/images/" />
  <resources mapping="/js/**" location="/js/" />


注解: 
mapping:映射     
location:本地资源路径,注意必须是webapp根目录下的路径。          
两个*,它表示映射resources/下所有的URL,包括子路径(即接多个/)
可能有筒子看完这个后会回来说:“博主写的啥玩意,照着写了还是没用,我绝对没敲错字!我还是复制过去的!!!”
如果真的有这样的哥们,别告诉我,否则我怕我会忍不住会拿出我的30米大刀!
请自行更换路径!!!
当然这个还有一个需要注意的地方:
配置的location一定要是web-app根目录下才行,如果你将资源目录,放置到web-app/WEB-INF下面的话,恭喜你,访问失败!404 NOT FOUND


方法3:全部使用默认的,也别操啥心了

[html]  view plain  copy
  1. <mvc:default-servlet-handler/>  

比较懒得童鞋可以直接在MVC配置文件加上这么一句,这个确实方便,但是弊端就是他会把你发出的请求全部按照默认的处理了!
如果直接贴出这一句,我怕又有筒子会说怎么报错了,mvc标签报错了!
哥们,你要是这种错误都解决不了,你也先别看这博文了,先去看看什么叫namespace吧!还来得及治疗!

[html]  view plain  copy
  1. <pre code_snippet_id="2167768" snippet_file_name="blog_20170207_4_9118558" style="margin-top: 0px; margin-bottom: 0px; margin-left: 22px; white-space: pre-wrap; word-wrap: break-word; line-height: 18px; font-family: 'Courier New' !important;"></pre>  
  2. <pre></pre>  
  3. <pre></pre>  
  •                     <li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#csdnc-thumbsup"></use>
                        </svg><span class="name">点赞</span>
                        <span class="count">1</span>
                        </a></li>
                        <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-Collection-G"></use>
                        </svg><span class="name">收藏</span></a></li>
                        <li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;1582594662_002&quot;}"><svg class="icon" aria-hidden="true">
                            <use xlink:href="#icon-csdnc-fenxiang"></use>
                        </svg>分享</a></li>
                        <!--打赏开始-->
                                                <!--打赏结束-->
                                                <li class="tool-item tool-more">
                            <a>
                            <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                            </a>
                            <ul class="more-box">
                                <li class="item"><a class="article-report">文章举报</a></li>
                            </ul>
                        </li>
                                            </ul>
                </div>
                            </div>
            <div class="person-messagebox">
                <div class="left-message"><a href="https://blog.csdn.net/kingmax54212008">
                    <img src="https://profile.csdnimg.cn/6/5/C/3_kingmax54212008" class="avatar_pic" username="kingmax54212008">
                                            <img src="https://g.csdnimg.cn/static/user-reg-year/1x/15.png" class="user-years">
                                    </a></div>
                <div class="middle-message">
                                        <div class="title"><span class="tit"><a href="https://blog.csdn.net/kingmax54212008" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">kingmax54212008</a></span>
                                            </div>
                    <div class="text"><span>发布了984 篇原创文章</span> · <span>获赞 423</span> · <span>访问量 299万+</span></div>
                </div>
                                <div class="right-message">
                                            <a href="https://bbs.csdn.net/topics/395532569" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-messageboard">他的留言板
                        </a>
                                                            <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                    </div>
                            </div>
                    </div>
    </article>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值