SpringBoot-静态资源映射
静态资源映射规则
在springBoot中的静态资源的映射是通过SpringMVC中的resourceHttpRequestHandler来进行实现的。在该请求映射器中默认规定了,SpringBoot会将classPath或者ServletContext下的/static (/public、/resources 或 /META-INF/resources)目录中,存放静态资源。并且其默认规定了所有的静态资源访问都被映射到/**,也就说,只要我们在访问静态资源时,只要是只需要在确保静态资源放在合理的位置,那么就可以通过类路径+文件名的形式来进行访问到该静态资源。
例如:
我现在在类路径下新建一个public目录,在其下放置一个AAA.jpg的图片静态资源。此时当我们启动服务后,就可以通过url:localhost:8001/AAA.jpg拿到这个静态资源。
在官网中也同样说明,“在一个独立的web应用中,来自容器的默认的Servlet是开启的,并且该方式会充当一个回退支援。”
这句话的解释:我们知道在spring中当我们通过url的形式来访问资源时,首先这个请求会被spring的dispatchServlet给接收,此时会通过HanderManping和HandlerAdapter来在spring中查找是否有相应的控制器。如果找到,则会直接执行该控制器,而不会再通过resourceHttpRequestHandler来查找相应的静态资源。通俗的来说也就是,我们通过url访问时,首先会检查是否有同名控制器,即此时会优先处理servlet请求,而不会处理ServletContext下的静态资源请求。
例子:
现在我在Controller中建立一个处理器请求,该请求映射路径为/AAA.jpg
此时再次请求相同路径(本意是访问静态资源)http://localhost:8001/AAA.jpg:
[注]
(1)当然我们也可以修改SpringBoot中默认的资源映射路径,这也是常用的方式,因为修改后,可以避免在今后如果添加拦截器时,防止将静态资源给拦截了。修改的方式:
//默认
spring.mvc.static-path-pattern=/resources/**
//自定义
spring.mvc.static-path-pattern=/myStatic/**
那么今后就需要在访问时,以上述例子为例:当前项目+自定义映射路径+静态资源名即localhost:8001/myStatic/AAA.jpg
(2)我们也可以通过spring.resources.static-locations 属性来自定义静态资源的位置(使用一个目录位置列表替换默认值)。根 Servlet context path / 自动作为一个 location 添加进来。