首页 > 解决方案 > Spring 5 和 Springs freemarker 宏中的转义

问题描述

更新到 Spring 5 后,Spring freemarker 宏的所有输出都被转义。在 <@spring.message> 中,消息被转义,而在 <@spring.formRadioButtons> 中,分隔符属性被转义为 fx "<br/>"。

配置:

@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

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

标签: springspring-mvcfreemarker

解决方案


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

更新:早些时候我建议禁用自动转义spring.ftlviatemplate_configurationsauto_escaping_policy,但事实证明这是错误的,因为一些宏在 Spring 4 via 中确实进行了转义,?html当切换到自动转义时它们已将其删除。所以那些不会逃脱,这又是错误的......


推荐阅读