如何对Freemarker中捕获赋值的变量输出进行转义?
解决Freemarker捕获语法生成变量的转义问题
问题本质
Freemarker中使用<#assign var>...</#assign>捕获语法生成的变量,会被存储为TemplateMarkupOutputModel类型——这是一种被标记为「已处理的安全输出」的对象,自动转义机制会跳过它;而直接赋值的字符串变量则会触发默认的自动转义逻辑,这就是你观察到两种示例差异的原因。
有效解决方案
1. 先转字符串再显式转义
将捕获的内容转换为普通字符串后,再使用对应格式的转义器(如?html用于HTML场景)处理:
<#assign test2> <!-- 这里是你的复杂内容,包含未转义的变量或HTML片段 --> <p>${userUnsafeInput}</p> </#assign> <!-- 正确输出:先转字符串再转义 --> ${test2?toString()?html}
2. 在捕获块内部启用自动转义
如果希望捕获的内容本身就带有转义效果,可以在捕获块内部开启自动转义:
<#assign test2> <#autoesc true> <!-- 块内的所有变量输出都会自动转义 --> <p>${userUnsafeInput}</p> </#autoesc> </#assign> <!-- 直接输出即可,内容已提前转义 --> ${test2}
为什么你之前的方法无效?
?esc:仅对字符串类型生效,无法处理TemplateMarkupOutputModel对象;<#outputformat>:仅影响后续输出的格式规则,无法修改已捕获的TemplateMarkupOutputModel内容;- 外部
<#autoesc>:捕获语法保存的是块内输出的最终结果,外部自动转义规则无法回溯修改已生成的标记内容; - 简单重新赋值:仅复制
TemplateMarkupOutputModel对象,未改变其类型和内容属性。
内容的提问来源于stack exchange,提问作者pitgrap
相关产品推荐
相关产品推荐

