无论项目以 tomcat 的方式部署,还是以 jar 包直接部署,都适用。静态资源的目录可以是服务器上运行 web 服务的用户能访问的任何位置。
需求场景
满足以下【前提一】中的任意一条,同时又满足【前提二】中任意一条,就需要把静态资源放在一个公共的地方。
- 前提一
- 需要做负载均衡
- 蓝绿部署
- 以 spring boot 生成的 jar 包直接运行
- 前提二
- 有静态的 html 文件是动态生成的
- 某些页面的图片是由用户/管理员上传的
- 需要下载的文件是动态生成的
需要达到的效果
访问配置的静态目录,就象是直接访问 spring boot 项目的 resources/static
目录下的文件一样。
注意事项
如果配置了多个静态目录,则需要保证这些目录下的文件不能重名。
以下是项目中的实际应用场景
- 发布的文章需要动态生成静态 html 文件
- 用户上传的头像在用户相关页面显示
用户头像以用户 id 命名,访问路径固定
- 图文并茂的文章编辑器,需要上传图片。可参考:springBoot 集成百度富文本框 UEditor,多模块方式
实施方案
spring boot 配置
在 application.yml 文件配置以下内容:1
2
3
4
5
6static.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.taobantech.com/
- 假设
/home/utomcat/apps/resources/staticPages
目录下有一个文件:articleIndex.html
,则这样访问:https://www.taobantech.com/articleIndex.html
- 假设
/home/utomcat/apps/resources/staticPages
目录下有一个目录:news
- news 下有两个文件:
- article0.html
- article.html
则上面两个文件这样访问:
https://www.taobantech.com/news/article0.html
https://www.taobantech.com/news/article1.html
假设
/home/utomcat/apps/resources/uploadImages
目录下有一个目录:images
- images 下有两个文件:
- image0.jpg
- image1.jpg
则上面两个文件这样访问:
https://www.taobantech.com/images/image0.jpg
https://www.taobantech.com/images/image2.jpg