本文转载自:http://www.yshjava.cn/post/333.html
FreeMarker作为"通用"模版引擎, 默认情况下不会对model中的值进行html转义, 然而在web项目中, 为了防止跨站脚本攻击等问题, 必须在对model中的值进行转义.
解决办法:
方法1. 是使用 ${x?html} 可以用于对单个值的转义
方法2. 使用<#escape x as x?html> ... </#escape> 将需要转义的html代码包起来, 这样其中所有的值都会被转义了.
毫无疑问这两个方法都需要大量的重复操作, 如果我所有的模板都需要转义, 有没有一劳永逸的办法呢?
方法3. 使用自定义TemplateLoader
首先我们需要实现一个TemplateLoader. 代码如下:
public class HtmlTemplateLoader implements TemplateLoader { private static final String HTML_ESCAPE_PREFIX= "<#escape x as x?html>"; 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 long getLastModified(Object templateSource) { return delegate.getLastModified(templateSource); } @Override public Reader getReader(Object templateSource, String encoding) throws IOException { Reader reader = delegate.getReader(templateSource, encoding); String templateText = IOUtils.toString(reader); return new StringReader(HTML_ESCAPE_PREFIX+templateText + HTML_ESCAPE_SUFFIX); } @Override public void closeTemplateSource(Object templateSource) throws IOException { delegate.closeTemplateSource(templateSource); } }
为了和SpringMVC结合起来使用呢, 我们还需要自定义一个FreeMarkerConfigurer
public class CustomFreeMarkerConfigurer extends FreeMarkerConfigurer{ @Override protected TemplateLoader getAggregateTemplateLoader(List<TemplateLoader> templateLoaders) { return new HtmlTemplateLoader(super.getAggregateTemplateLoader(templateLoaders)); } }
然后在spring的xml配置中, 使用它来代替默认的FreeMarkerConfigurer即可
<bean id="freemarkerConfigurer" class="cn.ysh.studio.freemarker.SimpleFreeMarkerConfigurer"> <!-- 其他配置跟之前相同 --> </bean>
当然,如果你觉得使用<#escape>标签不舒服的话,那么也可以自己对html字符串进行转义。HTML中的转义字符的数量不多,如下代码可以将带有跨站脚本攻击风险的html字符转义为安全字符(仅供参考):
String html = "8888</title><body><script type='text/javascript'>alert(\"跨站脚本\");</script>"; html = html.replace("'", "'");//替换单引号 html = html.replaceAll("&", "&");//替换& html = html.replace("\"", """); // 替换双引号 html = html.replace("\t", " ");// 替换跳格 html = html.replace(" ", " ");// 替换空格 html = html.replace("<", "<");//替换左尖括号 html = html.replaceAll(">", ">");//替换右尖括号
本文转载自http://www.cnblogs.com/nixil/archive/2012/04/23/2466364.html,并稍作修改!
相关推荐
Freemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+javaFreemarker模板生成pdf+java
大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出‘.doc’ word文档。经测试这样方式生成的word文档完全符合office标准,...
基于Freemarker模板的纯Java代码实现的代码生成器工具
FreeMarker概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力...
最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用freemarker模板生成word文档。里面包括完整代码和所需jar包。
freeMarker模板文件 word文件示例、ftl文件示例、输出文件示例,方便学习者自己制作模板。
FreeMarker 是一款模板引擎:即一种基于模板、用来生成输出文本(任何来自于 HTML格式,pdf格式的文本用来自动生成源代码)的通用工具。它是为 Java 程序员提供的一个开发包,本教程绝对详细,叫你从精通,玩转它
通过springboot 整合freemarker模板引擎,自动发送html格式邮件
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所...
使用freeMarker模板和Spring boot后端API接口实现查询用户列表的功能。 http://localhost:8080/ftl/index
Java freemarker 模板生成word动态表格
在这里将通过Freemarker这个模板引擎来实现导出 Word,项目不限于Swing,SSH,SSM,Spring Boot 之类的 ————————————— Spring Boot,Freemarker 编辑好格式的Word文档 1份 将Word文档里需要填充的地方...
简单的实现了java使用freemarker模板技术导出word的简单功能,不喜勿喷,网上很多的不详细
freemarker模板引擎的资料,适合新手使用和了解,有需要的可以下载看一看。
FreeMarker模板基本语法
java通过freemarker模板导出word含图片,希望对你有用,本代码只支持doc格式,如果不满足你的需求,请担待着点!谢谢您能给予好评,非常感谢。
freemarker模板生成例子 可以根据表名生成其增删改查方法以及jsp页面,基于spirng,spring-mvc,mybatis .使用前请更改jdbc配置文件下的项目路径和数据库,生成后需要将controller上方注释复制到mybatisconfig中对应...
Struts2与FreeMarker模板
通过程序生成PDF文件, wkhtmltox-0.12.3.2_msvc2013-win64.exe html-url
1、Word模板转html模板的操作步骤(图示例+操作描述,13张图); 2、由上述生成的html模板通过java代码生成pdf; 3、示例有本地模板和远程模板之分,可杜绝pdf标题丢失的问题; 4、资源概要:先阅读README.md文档,然后...