所以我现在使用 Spring 5.3.xx 和一个简单的 ftl 文件(我现在已经简化了它)
<#import "/spring.ftl" as spring/>
<@spring.formInput path="${textInputName}" attributes='maxlength="1024" '/>
使用
context.xml
中的一些简单的自由标记设置
<property name="freemarkerSettings">
<props>
<prop key="datetime_format">yyyy-MM-dd</prop>
<prop key="url_escaping_charset">UTF-8</prop>
</props>
</property>
我已经启用了转义功能
web.xml
<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
我面临双重转义的问题。页面重新加载时,像
"abc"
中的 input
这样的简单值将呈现为 "abc"
值中的 input
。
ftl
,因为 spring.ftl
使用 #ftl output_format="HTML"
并导致下面的 autoEscape
设置为 true
我们是否应该关闭从
web.xml
(这对我来说似乎不安全)逃离春天的功能,还是我错过了其他东西?
参考:https://github.com/spring-projects/spring-framework/issues/19306
TLDR;只需保留
defaultHtmlEscape
上下文参数未设置,并且不使用某些古老的 Spring/JSTL 版本,那么 JSP 和 FreeMarker 都会转义 HTML 表单值一次。特别是如果您不使用 JSP,则无需担心,因为 spring.formInput
已硬连线以在 spring.ftl
中进行 HTML 转义。
更长的版本...
我的经验是,至少在 Spring 5.2.3(附带 JSTL 1.2.7)中,如果您根本不设置
form:input
上下文参数,JSP defaultHtmlEscape
标记默认会转义。另外,FreeMarker spring.formInput
只能通过 ${...}
FreeMarker 自动转义来转义,而不是通过 JSTL 绑定转义机制。所以默认情况下 JSP 和 FreeMarker 都会转义一次。
OTOH 如果您将
defaultHtmlEscape
设置为任何内容(true
或 false
),则两者之一(JSP 或 FreeMarker 表单支持)将被破坏。
但是,如果有一些公司政策要求您拥有
defaultHtmlEscape=true
,那么您可以采取以下解决方法:
<#import "/spring.ftl" as spring/>
<#assign htmlEscape = false in spring>
...
<@spring.formInput "user.name" />
在那里,
<#assign htmlEscape = false in spring>
仅针对此响应生成禁用 JSTL 绑定转义,但 spring.formInput
仍将执行自己的转义。
更新: 有一个关于
<#assign htmlEscape = false in spring>
的警告。 <@spring.message ... />
不受其影响,但受defaultHtmlEscape
影响。如果未设置 defaultHtmlEscape
,或者设置为 false
,则消息不会转义。 defaultHtmlEscape
设置为 true
,消息被转义。