FreeMarker作为"通用"模版引擎, 默认情况下不会对model中的值进行html转义, 然而在web项目中, 为了防止跨站脚本攻击等问题, 必须在对model中的值进行转义.
解决办法:
方法1.是使用 ${x?html} 可以用于对单个值的转义
方法2.使用 ... #escape> 将需要转义的html代码包起来, 这样其中所有的值都会被转义了.
毫无疑问这两个方法都需要大量的重复操作, 如果我所有的模板都需要转义, 有没有一劳永逸的办法呢?
方法3.使用自定义TemplateLoader
首先我们需要实现一个TemplateLoader. 代码如下:
public class HtmlTemplateLoader implements TemplateLoader {
private static final String HTML_ESCAPE_PREFIX= "";
private static final String HTML_ESCAPE_SUFFIX = "#escape>";
private final TemplateLoader delegate;
public HtmlTemplateLoader(TemplateLoader delegate) {
this.delegate = delegate;
}
@Override
public Object findTemplateSource(String name) throws IOException {
return delegate.findTemplateSource(name);
}
@Override
public lon