Spring静态资源
外观
Spring静态资源[编辑 | 编辑源代码]
概述[编辑 | 编辑源代码]
在Spring Web开发中,静态资源指不需要服务器动态处理的文件(如HTML、CSS、JavaScript、图片等)。Spring框架提供了多种机制来高效地管理这些资源,本条目将详细介绍配置方法、处理流程及最佳实践。
核心机制[编辑 | 编辑源代码]
Spring通过`ResourceHttpRequestHandler`处理静态资源,支持以下配置方式:
1. 默认静态资源位置[编辑 | 编辑源代码]
Spring Boot自动配置以下目录为静态资源路径:
- `classpath:/static/`
- `classpath:/public/`
- `classpath:/resources/`
- `classpath:/META-INF/resources/`
示例项目结构:
src/
└── main/
├── java/
└── resources/
├── static/
│ ├── style.css
│ └── logo.png
└── templates/
2. 自定义资源路径[编辑 | 编辑源代码]
在`application.properties`中修改配置:
spring.web.resources.static-locations=classpath:/custom-static/,file:/opt/files
或在Java配置类中覆盖:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**")
.addResourceLocations("file:/var/www/");
}
}
缓存控制[编辑 | 编辑源代码]
Spring提供静态资源缓存策略配置:
spring.web.resources.cache.period=3600 # 缓存1小时
spring.web.resources.cache.cachecontrol.max-age=1h
spring.web.resources.cache.cachecontrol.no-cache=false
版本化资源[编辑 | 编辑源代码]
使用内容哈希实现长期缓存:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/")
.setCacheControl(CacheControl.maxAge(365, TimeUnit.DAYS))
.resourceChain(true)
.addResolver(new VersionResourceResolver().addContentVersionStrategy("/**"));
}
}
处理后URL示例:
- 原始文件:`/static/js/app.js`
- 版本化后:`/static/js/app-df55b8e3a7.js`
高级配置[编辑 | 编辑源代码]
资源转换[编辑 | 编辑源代码]
使用`ResourceTransformer`实现实时处理(如Sass编译):
registry.addResourceHandler("/css/**")
.addResourceLocations("classpath:/scss/")
.resourceChain(false)
.addTransformer(new CssLinkResourceTransformer());
Gzip压缩[编辑 | 编辑源代码]
配置压缩静态资源:
spring.web.resources.compression.enabled=true
spring.web.resources.compression.min-response-size=512B
安全注意事项[编辑 | 编辑源代码]
- 避免将敏感目录(如`/WEB-INF`)暴露为静态资源
- 对用户上传文件使用独立域名(防止XSS)
- 启用HTTPS保护静态资源完整性
性能优化建议[编辑 | 编辑源代码]
数学公式示例(带宽计算):
实际案例[编辑 | 编辑源代码]
电商网站图片服务配置
@Configuration
public class ImageConfig implements WebMvcConfigurer {
@Value("${app.image.dir}")
private String imageDir;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/product-images/**")
.addResourceLocations("file:" + imageDir + "/")
.setCacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
.resourceChain(true)
.addResolver(new WebJarsResourceResolver());
}
}
常见问题[编辑 | 编辑源代码]
Q: 为什么我的CSS文件返回404? A: 检查: 1. 文件是否在配置的静态资源目录中 2. 是否被Spring Security拦截 3. URL路径是否包含上下文路径
Q: 如何禁用静态资源处理?
spring.web.resources.add-mappings=false