Spring Boot+Tomcat部署Angular应用遇WOFF2字体解析错误求助
WOFF2字体部署到Spring Boot/Tomcat后解析错误的排查思路
问题背景
- 本地硬盘加载Angular应用时,FontIcons可正常工作(仅URL错误会导致服务器通信问题);但部署到Spring Boot+Tomcat服务器后,出现错误:
OTS parsing error: Size of decompressed WOFF 2.0 is less than compressed size - 对比磁盘与HTTP请求返回的字体文件十六进制数据,发现字节被篡改:
磁盘文件: 77 4F 46 32 00 01 00 00 00 01 F5 60 00 0F 00 00 HTTP返回: 77 4F 46 32 00 01 00 00 00 01 EF BF BD 60 00 0F - 服务器响应头信息:
HTTP/1.1 200 Vary: Origin Vary: Access-Control-Request-Method Vary: Access-Control-Request-Headers Last-Modified: Tue, 26 Sep 2023 12:54:26 GMT Accept-Ranges: bytes X-Content-Type-Options: nosniff X-XSS-Protection: 0 Cache-Control: no-cache, no-store, max-age=0, must-revalidate Pragma: no-cache Expires: 0 X-Frame-Options: DENY Content-Type: font/woff2 Content-Length: 128352 Date: Fri, 29 Sep 2023 06:51:55 GMT Keep-Alive: timeout=20 Connection: keep-alive - 浏览器差异:Chrome 116.0.5845.141可正常运行,Edge 117.0.2045.36仍存在解析问题
排查解决思路
1. 检查字符编码转换配置
- 注意到
F5被替换为EF BF BD(UTF-8替换字符�),说明服务器可能将二进制字体文件误当作文本进行了编码转换。 - 排查Spring Boot的
HttpMessageConverter配置,确保未对font/woff2这类二进制媒体类型启用字符编码转换。 - 检查Tomcat的
server.xml或web.xml,确认全局字符过滤器(如CharacterEncodingFilter)未将*.woff2、*.woff等后缀的请求纳入文本处理范围,需添加排除规则。
2. 验证静态资源处理逻辑
- 确认Spring Boot是否通过默认的
ResourceHttpRequestHandler处理静态资源,排查是否自定义资源处理器导致二进制文件被篡改。 - 检查
application.properties/application.yml中的spring.http.encoding.*配置,这类配置应仅作用于文本类型(如text/html、application/json),不要覆盖二进制资源。 - 确保字体文件位于Angular构建后的
assets目录,Spring Boot正确映射了静态资源路径(默认classpath:/static/、classpath:/public/等)。
3. 排查压缩与缓存配置
- 检查Tomcat或Spring Boot是否启用Gzip压缩,确认压缩规则正确处理woff2文件,错误的压缩配置可能导致文件损坏。
- 响应头中
Cache-Control设置为no-cache, no-store,虽不直接导致篡改,但可临时调整为max-age=86400测试是否影响文件传输完整性。
4. 验证文件传输完整性
- 对比服务器存储的字体文件与本地文件的MD5/SHA1哈希值,确认部署过程中文件未损坏。
- 使用
curl或Postman下载服务器上的字体文件,保存后对比十六进制数据,确认是服务器返回时篡改,还是传输过程中出现问题。
5. Edge浏览器专项排查
- 打开Edge开发者工具的「网络」面板,查看字体文件的实际下载大小是否与
Content-Length一致。 - 勾选「禁用缓存」后重新加载页面,排除缓存的损坏文件影响。
- 临时禁用Edge所有扩展程序,排查是否有扩展拦截或修改字体文件。
6. 显式配置媒体类型映射
- 在Spring Boot中显式配置woff2的媒体类型映射,确保服务器正确识别:
或在@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { configurer.mediaType("woff2", MediaType.valueOf("font/woff2")); } }application.properties中添加:spring.mvc.media-types.woff2=font/woff2
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

