升级JDK与Struts后Font-face图标显示异常问题求助
Struts2 2.3升级至2.5后Font-face图标渲染异常问题分析
问题背景与现象
- 已按照官方迁移指南完成Struts2从2.3.37到2.5.33的升级,同步将JDK版本从6升至7
- 异常表现:部分页面的
Pe-icon-7-stroke字体图标无法正常渲染,浏览器已成功加载包含该font-face的CSS文件,但该字体未被正确解析;同一CSS文件内的其他字体图标显示完全正常
初步排查方向与原因判断
1. Struts2静态资源处理逻辑变更
Struts2 2.5对静态资源的处理机制做了重要调整,核心变化可能影响字体文件的访问:
- 默认静态资源处理器的规则更新,可能未正确识别
Pe-icon-7-stroke对应的字体文件类型(如.ttf/.woff),导致返回的MIME类型错误,浏览器无法解析 - 静态资源拦截范围调整,字体文件请求被Struts2核心过滤器拦截,未被正确转发到静态资源处理流程,返回内容异常(比如返回HTML而非字体二进制数据)
2. JDK版本升级带来的资源打包影响
JDK7的默认压缩工具、编码逻辑与JDK6存在差异:
- 如果项目构建过程中对静态资源(包括字体文件)进行了压缩或转码,JDK7可能破坏了
Pe-icon-7-stroke字体文件的二进制结构,而其他字体文件因格式或压缩规则未受影响,最终导致浏览器无法解析该字体
配置修改与解决建议
调整Struts2静态资源相关配置(struts.xml)
- 配置正确的字体文件MIME类型映射
添加以下常量,确保浏览器能正确识别字体文件类型:
<constant name="struts.static.contentType.mappings" value="eot=application/vnd.ms-fontobject,woff=application/font-woff,woff2=font/woff2,ttf=application/font-sfnt,svg=image/svg+xml"/>
- 排除字体文件路径被Struts2过滤器拦截
通过struts.action.excludePattern配置,让字体文件请求直接绕过Struts2核心过滤器:
<constant name="struts.action.excludePattern" value="/static/fonts/.*?\.(eot|woff|woff2|ttf|svg)"/>
注:需将路径/static/fonts/替换为你项目中实际的字体文件存放路径
- 验证静态资源处理器配置
确认struts.staticContentHandler使用默认实现org.apache.struts2.dispatcher.DefaultStaticContentHandler,若有自定义处理器,需检查其对字体文件的处理逻辑是否存在漏洞
检查项目构建脚本
确保在JDK7环境下打包时,不对字体文件进行不必要的压缩或转码。例如在Maven的maven-resources-plugin中添加过滤规则:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <nonFilteredFileExtensions> <nonFilteredFileExtension>eot</nonFilteredFileExtension> <nonFilteredFileExtension>woff</nonFilteredFileExtension> <nonFilteredFileExtension>woff2</nonFilteredFileExtension> <nonFilteredFileExtension>ttf</nonFilteredFileExtension> <nonFilteredFileExtension>svg</nonFilteredFileExtension> </nonFilteredFileExtensions> </configuration> </plugin>
内容的提问来源于stack exchange,提问作者Alexandre
相关产品推荐
相关产品推荐

