无论项目以 tomcat 的方式部署,还是以 jar 包直接部署,都适用。静态资源的目录可以是服务器上运行 web 服务的用户能访问的任何位置。

需求场景

满足以下【前提一】中的任意一条,同时又满足【前提二】中任意一条,就需要把静态资源放在一个公共的地方。

  • 前提一
    • 需要做负载均衡
    • 蓝绿部署
    • 以 spring boot 生成的 jar 包直接运行
  • 前提二
    • 有静态的 html 文件是动态生成的
    • 某些页面的图片是由用户/管理员上传的
    • 需要下载的文件是动态生成的

需要达到的效果

访问配置的静态目录,就象是直接访问 spring boot 项目的 resources/static 目录下的文件一样。

注意事项

如果配置了多个静态目录,则需要保证这些目录下的文件不能重名。

以下是项目中的实际应用场景

实施方案

spring boot 配置

在 application.yml 文件配置以下内容:

1
2
3
4
5
6
static.pages: /home/utomcat/apps/resources/staticPages
static.upload.images: /home/utomcat/apps/resources/uploadImages
uEditor.upload.path: /home/utomcat/apps/webLoadBalance/uEditorUploads
uEditor.upload.path.web: /home/utomcat/apps/webLoadBalance
spring.mvc.static-path-pattern: /**
spring.resources.static-locations: classpath:/resources/,classpath:/static/,file:${uEditor.upload.path},file:${uEditor.upload.path.web},file:${static.pages},file:${static.upload.images}

这样配置的效果

  • 假设网站为:https://www.lovesofttech.com/
  • 假设 /home/utomcat/apps/resources/staticPages 目录下有一个文件:articleIndex.html,则这样访问:https://www.lovesofttech.com/articleIndex.html
  • 假设 /home/utomcat/apps/resources/staticPages 目录下有一个目录:news
  • news 下有两个文件:
    • article0.html
    • article.html

则上面两个文件这样访问:

  • https://www.lovesofttech.com/news/article0.html
  • https://www.lovesofttech.com/news/article1.html

  • 假设 /home/utomcat/apps/resources/uploadImages 目录下有一个目录:images

  • images 下有两个文件:
    • image0.jpg
    • image1.jpg

则上面两个文件这样访问:

  • https://www.lovesofttech.com/images/image0.jpg
  • https://www.lovesofttech.com/images/image2.jpg