【问题标题】:Spring 5 and escaping in Springs freemarker macrosSpring 5 和 Springs freemarker 宏中的转义
【发布时间】:2018-11-25 01:52:31
【问题描述】:

更新到 Spring 5 后,Spring freemarker 宏的所有输出都被转义。在 中,消息被转义,而在 中,分隔符属性被转义 f.x。 “
”。

配置:

@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
    FreeMarkerConfigurer config = new FreeMarkerConfigurer();
    config.setTemplateLoaderPath("/WEB-INF/templates/ftl/");

    Properties props = new Properties();
    props.put("template_update_delay", getFreemarkerUpdateDelay());
    props.put("template_exception_handler", getFreemarkerExceptionHandler());
    props.put("url_escaping_charset", WebConstants.CHAR_SET_UTF_8);
    config.setFreemarkerSettings(props);
    config.setDefaultEncoding(WebConstants.CHAR_SET_UTF_8);
    return config;
}

我们使用 Freemarker 2.3.28 和 Spring 5.0.7.RELEASE

关于如何关闭宏输出转义的任何想法。

【问题讨论】:

    标签: spring spring-mvc freemarker


    【解决方案1】:

    查看https://github.com/spring-projects/spring-framework/blob/master/spring-webmvc/src/main/resources/org/springframework/web/servlet/view/freemarker/spring.ftl,它以<#ftl output_format="HTML" ...> 开头,因此特定模板已为自己激活了HTML 自动转义,这比outputFormat Configuration 设置强。由于MessageSource.getMessage 只能返回String(因此不能返回TemplateMarkupOutputModel,FreeMarker 不会自动转义),在我看来,维护人员在这里做了严重的疏忽。他们已经非常破坏了向后兼容性(假设它确实没有在 Spring 4 中转义),但更糟糕的是,我不明白他们想要如何支持不转义。 spring.message 或任何东西都没有这种变化。 (它再次反击spring.message 不是一个函数,因为那时你可以在它上面应用?noesc。)所以你应该向他们报告。

    更新:之前我曾建议通过template_configurationsauto_escaping_policy 禁用spring.ftl 上的自动转义,但事实证明这是错误的,因为某些宏确实在Spring 4 中通过?html 进行了转义,他们已将其删除切换到自动转义时。那么那些就不会逃跑了,这又是错误的......

    【讨论】:

    • 导致此更改的相应 Spring 票证:jira.spring.io/browse/SPR-14740
    • 是的,就是这个。所以现在它的行为类似于他们在 Spring 4 的所有插值中都有 ?html,但他们没有,就像 #macro message 没有它:github.com/spring-projects/spring-framework/blob/…。添加#ftl output_format='HTML' 标头时,他们必须在这些地方写上${someExpression?noesc}
    • 我也取消了我之前使用auto_escaping_policy的想法...查看更新原因。
    • @KajHejer 太好了,谢谢!尽管在使用spring.ftl 的范围内肯定不是“次要”问题。 (顺便说一句,我不确定他们是否利用这个机会(5.0)来增加incompatible_improvements 设置,但如果没有,我建议将其设置为2.3.28。)
    • 很简单。他们在 Spring 4 中拥有不包含 ?html${foo},现在他们应该拥有 ${foo?noesc}。当然,他们在 Spring 4 中有 ${foo?html}${foo} 应该在 Spring 5 中说。
    猜你喜欢
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2010-11-18
    • 2015-09-24
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多