我自己在做Spring Boot的demo时发现根据官方提供的处理静态文件的方法,并不能够顺利访问静态资源。
原因是我在Controller的方法中@RequestMapping()没有指定任何参数,而导致的默认拦截所有请求。(当初是不想看到404才这样写的,说是所有请求有点不准确,是发出的请求如果在其它的@ReqestMapping()中没有找到,就跳到这个没有指定任何参数的@RequestMapping()修饰的方法中)。
但是为什么会影响到静态资源的访问呢?是因为Spring MVC
在处理请求时如何判断到底是想发出请求动作还是要获取静态资源呢?这涉及到HandlerMapping的执行顺序问题:
DefaultAnnotationHandlerMapping的order属性值是:0
<mvc:resources/>自动注册的SimpleUrlHandlerMapping的order属性值是:2147483646
<mvc:default-servlet-handler/>自动注册的SimpleUrlHandlerMapping的order属性值是:2147483647
Spring会先执行order值比较小的。当访问一个a.jpg图片文件时,先通过DefaultAnnotationHandlerMapping来找处理器,一定是找不到的,我们没有叫a.jpg的Action。再按order值升序找,由于最后一个SimpleUrlHandlerMapping是匹"/**"的,所以一定会匹配上,再响应图片。
参考链接:http://www.imooc.com/article/9241 其中有访问Spring Boot访问静态资源的几种方式
由上可知所有请求在没有被显式声明的情况下都会进入这个没有指定任何参数的@RequestMapping()修饰的方法中,没有处理静态资源请求的份,所以需要将@RequestMapping()指定参数就可以解决此问题,但是这样就不能够拦截其它没有被显式声明的请求了。
谢谢!