springboot静态资源映射

SpringBoot的静态静态资源映射,说白了就是资源告诉框架:你上哪儿找图片、CSS、映射JS这些“死文件”。静态默认规则很简单,资源classpath下的映射/static、/public、静态/resources、资源/META-INF/resources四个目录,映射统统归它管。静态你往src/main/resources/static里丢个a.jpg,资源浏览器直接访问http://localhost:8080/a.jpg就能看到。映射

但实际开发中,静态总有例外。资源比如你有个上传文件的映射模块,图片存在服务器本地磁盘的/home/user/upload/,这地方可不在classpath里。这时候就得手动加映射。配置代码就几行,写个WebMvcConfigurer的实现类,重写addResourceHandlers方法:

@Configuration public class WebConfig implements WebMvcConfigurer {  @Override public void addResourceHandlers(ResourceHandlerRegistry registry) {  registry.addResourceHandler("/upload/**") .addResourceLocations("file:/home/user/upload/"); } }

注意那个file:前缀,少了它SpringBoot会以为你要从classpath里找。另外路径末尾的斜杠也得写,否则拼接时会出问题——这坑我踩过,当时排查了半小时,最后发现是少了个/。

还有一种场景,前端用Vue或React打包后,dist目录里全是静态文件。你想让SpringBoot直接托管整个前端,除了把dist内容拷到static下,也可以指定外部目录。比如部署时前端文件放在/opt/webapp,那映射就写成addResourceLocations("file:/opt/webapp/")。好处是前端更新时不用重新打后端jar包,运维直接替换文件就行。

有人会问,addResourceHandler里的/**会不会把接口请求也拦截了?不会。SpringBoot的DispatcherServlet会先匹配@Controller和@RequestMapping,找不到才轮到静态资源处理器。但要注意,如果你自定义了WebMvcConfigurer,默认的静态资源映射可能被覆盖。所以最稳妥的做法是:保留spring.mvc.static-path-pattern默认值/**,同时别在配置类上乱加@EnableWebMvc注解——那玩意儿会关掉SpringBoot的自动配置,开启后默认映射就全失效了。

再聊个细节。开发环境里经常改前端代码,浏览器缓存却死死记着旧文件。你可以在application.properties里设置spring.web.resources.cache.cachecontrol.max-age=0,让资源每次强制重新验证。但生产环境建议设个合理缓存时间,比如max-age=86400(一天),配合文件名指纹(如app.a1b2c3.js)来避免缓存问题。SpringBoot对带版本号的静态资源还提供了VersionResourceResolver,不过配置稍复杂,一般项目用不上。

最后说个容易被忽略的点:Windows和Linux路径写法不同。Windows下用file:E:/upload/(盘符后是冒号加斜杠),Linux下是file:/usr/local/upload/。如果你在Windows本地调试,部署到Linux服务器,最好把路径抽到application.yml里,用@Value注入,免得改代码。

静态资源映射这功能,平时不起眼,但一旦遇到文件存储、前后端分离部署,它就是绕不开的一环。记住几个关键点:file:前缀不能少,路径末尾斜杠别漏,自定义配置时别误关自动配置。做到这三点,基本就稳了。

探索
上一篇:王者荣耀隐藏战绩查询代码教程
下一篇:基于web的分页技术的研究与实现论文