Struts升级至6.3.0.2后actionError.jsp行61报错求助
Struts 2.5.33升级到6.3.0.2报错原因及修复方案
报错原因
第61行的</c:otherwise>本身语法无问题,报错是因为它包裹的<t:actionmessage>标签调用了自定义Freemarker模板actionmessage.ftl,该模板存在语法冲突:
Struts 6.x默认升级了Freemarker版本,且在HTML输出格式下强制开启自动转义,而模板第3行使用了旧版的?html手动转义语法,这会触发双重转义风险,Freemarker为避免此类错误直接抛出语法异常,最终Jasper处理JSP时将报错定位到模板调用代码块的结尾(即第61行)。
触发报错的模板代码:
class="${parameters.cssClass?html}"<#rt/>
修复方案
无需修改第61行的JSP代码,核心是修复引用的Freemarker模板,可选以下方式:
- 方案一:移除旧版转义标记(推荐)
删除模板中的?html后缀,自动转义已会对HTML输出做转义处理,修改后代码:class="${parameters.cssClass}"<#rt/> - 方案二:关闭模板自动转义(不推荐,需手动维护转义)
在actionmessage.ftl开头添加配置,关闭当前模板的自动转义:
此方式需确保所有需转义变量都手动添加<#ftl output_format="HTML" auto_escaping="off">?html,否则存在XSS风险。 - 方案三:适配新转义语法
用Freemarker新转义语法替代?html,示例:
注意:此方式与自动转义同时启用仍可能引发重复转义,优先选择方案一。class="${parameters.cssClass?escape('HTML')}"<#rt/>
内容的提问来源于stack exchange,提问作者priya Jain
相关产品推荐
相关产品推荐

