Spring MVC - spring.ftl 导致特殊字符双重转义

问题描述 投票:0回答:1

所以我现在使用 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
这样的简单值将呈现为
&quot;abc&quot;
值中的
input

  • 一个来自 spring,当它尝试绑定状态时

https://github.com/spring-projects/spring-framework/blob/08bc1a050ec87cdaad6b05170c27e34d3f90cafa/spring-webmvc/src/main/java/org/springframework/web/servlet/support/BindStatus.java#L166-L168

  • 另一则来自
    ftl
    ,因为
    spring.ftl
    使用
    #ftl output_format="HTML"
    并导致下面的
    autoEscape
    设置为
    true

https://github.com/apache/freemarker/blob/df938ce6120ca155b87d48df97b3a6d62123b17f/src/main/java/freemarker/core/DollarVariable.java#L67-L71

我们是否应该关闭从

web.xml
(这对我来说似乎不安全)逃离春天的功能,还是我错过了其他东西?

参考:https://github.com/spring-projects/spring-framework/issues/19306

java spring spring-mvc freemarker
1个回答
1
投票

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
,消息被转义。

© www.soinside.com 2019 - 2024. All rights reserved.