跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Spring静态资源
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Spring静态资源 = == 概述 == 在Spring Web开发中,'''静态资源'''指不需要服务器动态处理的文件(如HTML、CSS、JavaScript、图片等)。Spring框架提供了多种机制来高效地管理这些资源,本条目将详细介绍配置方法、处理流程及最佳实践。 == 核心机制 == Spring通过`ResourceHttpRequestHandler`处理静态资源,支持以下配置方式: === 1. 默认静态资源位置 === Spring Boot自动配置以下目录为静态资源路径: * `classpath:/static/` * `classpath:/public/` * `classpath:/resources/` * `classpath:/META-INF/resources/` 示例项目结构: <syntaxhighlight lang="text"> src/ └── main/ ├── java/ └── resources/ ├── static/ │ ├── style.css │ └── logo.png └── templates/ </syntaxhighlight> === 2. 自定义资源路径 === 在`application.properties`中修改配置: <syntaxhighlight lang="properties"> spring.web.resources.static-locations=classpath:/custom-static/,file:/opt/files </syntaxhighlight> 或在Java配置类中覆盖: <syntaxhighlight lang="java"> @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/files/**") .addResourceLocations("file:/var/www/"); } } </syntaxhighlight> == 缓存控制 == Spring提供静态资源缓存策略配置: <syntaxhighlight lang="properties"> spring.web.resources.cache.period=3600 # 缓存1小时 spring.web.resources.cache.cachecontrol.max-age=1h spring.web.resources.cache.cachecontrol.no-cache=false </syntaxhighlight> == 版本化资源 == 使用内容哈希实现长期缓存: <syntaxhighlight lang="java"> @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("/**")); } } </syntaxhighlight> 处理后URL示例: * 原始文件:`/static/js/app.js` * 版本化后:`/static/js/app-df55b8e3a7.js` == 高级配置 == === 资源转换 === 使用`ResourceTransformer`实现实时处理(如Sass编译): <syntaxhighlight lang="java"> registry.addResourceHandler("/css/**") .addResourceLocations("classpath:/scss/") .resourceChain(false) .addTransformer(new CssLinkResourceTransformer()); </syntaxhighlight> === Gzip压缩 === 配置压缩静态资源: <syntaxhighlight lang="properties"> spring.web.resources.compression.enabled=true spring.web.resources.compression.min-response-size=512B </syntaxhighlight> == 安全注意事项 == * 避免将敏感目录(如`/WEB-INF`)暴露为静态资源 * 对用户上传文件使用独立域名(防止XSS) * 启用HTTPS保护静态资源完整性 == 性能优化建议 == <mermaid> graph TD A[客户端请求] --> B{是否缓存?} B -->|是| C[返回304 Not Modified] B -->|否| D[读取资源] D --> E[压缩处理] E --> F[设置缓存头] F --> G[返回200 OK] </mermaid> 数学公式示例(带宽计算): <math> \text{理论吞吐量} = \frac{\text{资源大小}}{\text{网络延迟} + \frac{\text{资源大小}}{\text{带宽}}} </math> == 实际案例 == '''电商网站图片服务配置''' <syntaxhighlight lang="java"> @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()); } } </syntaxhighlight> == 常见问题 == '''Q: 为什么我的CSS文件返回404?''' A: 检查: 1. 文件是否在配置的静态资源目录中 2. 是否被Spring Security拦截 3. URL路径是否包含上下文路径 '''Q: 如何禁用静态资源处理?''' <syntaxhighlight lang="java"> spring.web.resources.add-mappings=false </syntaxhighlight> == 参见 == * [[Spring MVC]] * [[HTTP缓存机制]] * [[前端性能优化]] [[Category:后端框架]] [[Category:Spring]] [[Category:Spring Web开发]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)