You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:14:58