springboot静态资源的处理

引:由于springboot架构遇到了图片的上传处理,以及之后的前台显示,所以就理解了一下其中关于静态资源的处理。

默认的静态资源处理

在每次启动springboot的项目的时候,我们都可以在控制台看见下面的语句输出:

1
2
3
2017-10-20 16:06:50.540  INFO 36443 --- [  restartedMain] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-10-20 16:06:50.540 INFO 36443 --- [ restartedMain] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2017-10-20 16:06:50.569 INFO 36443 --- [ restartedMain] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]

这里面就用到了springboot默认的静态资源处理。

其中默认配置的/**映射到/static(或/public、/resources、/META-INF/resources)

其中默认配置的/webjars/**映射到classpath:/META-INF/resources/webjars/

PS:上面的 static、public、resources 等目录都在 classpath: 下面(如 src/main/resources/static)

在访问静态资源的时候,这些目录也会有一个查找顺序(优先级):这里测试过发现他们的优先级是:META/resources > resources > static > public

自定义静态资源处理

配置方式

  1. 通过配置文件(application.properties)配置
    1
    2
    3
    4
    # 默认值为 /**
    spring.mvc.static-path-pattern=
    # 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/
    spring.resources.static-locations=这里设置要指向的路径,多个使用英文逗号隔开,

当我们要设置成我们的目录:/myresource/**,我们需要这样设置:

1
2
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,classpath:/myresource/

当我们设置过映射路径时候,如果还是/**,那么默认的映射就失效了,我们需要重新把原来的路径也添加上。这里的配置路径只可以设置一个。

  1. 通过配置类配置
    1
    2
    3
    4
    5
    6
    7
    8
    @Configuration
    public class MyWebAppConfigurer extends WebMvcConfigurerAdapter{
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/myresource/**").addResourceLocations("file:/var/alldata/image/");
    super.addResourceHandlers(registry);
    }
    }

可以通过这个方式设置多个配置路径。

配置内外目录

  1. 内部目录

做法是添加映射路径 classpath:/路径

方式见通过配置文件配置

  1. 外部目录

想一想如果将上传的图片继续存在jar包中会有那些问题?

  • 网络数据与程序代码不能分离
  • 数据传到jar里速度慢
  • 数据备份麻烦

有了以上的考虑我们会想到将上传的数据放在磁盘的目录上。

做法是添加映射路径 file:/var/alldata/images

方式见通过配置类配置

总结

springboot倡导的是习惯优于配置,大部分时候我们用他默认的配置就好了,但是他也提供了方便的配置类,需要我们好好学习。

参考

  1. Spring Boot 静态资源处理
  2. Springboot 之 静态资源路径配置