本文转载自: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模板基本语法 #### 一、FreeMarker概述与基本用法 **FreeMarker**是一种强大的、基于Java的模板引擎,主要用于动态生成HTML页面,但也支持其他类型的文本格式(如XML、JavaScript、电子邮件等)。它...
html`用于转义HTML特殊字符,`?length`获取集合长度等。 3. **图片插入**: - 在Freemarker模板中插入图片,通常涉及两个步骤: - 将图片资源部署到服务器的静态资源目录,例如`/images/`。 - 在模板中通过相对...
Freemarker模板是一种强大的、基于Java的开源模板引擎,用于生成动态内容。它主要用于Web应用程序,尤其是与Spring框架集成时,但也可用于任何需要将数据模型转化为文本输出的场景,如电子邮件生成、报告制作等。在...
通常,我们需要借助第三方库,如Apache POI,先将FreeMarker模板转换为HTML,然后再转换为Word或Excel。这种方式虽然多了一步,但依然能保持模板和数据的分离。 5. SpringMVC集成: 在SpringMVC框架中,可以通过...
Freemarker 是一个强大的模板引擎,它允许开发者通过模板语言与数据模型相结合来生成文本输出,如 HTML、PDF 或其他文档格式。以下是关于这一主题的详细知识: 1. **Freemarker 概述**: - Freemarker 是一个开源...
Freemarker是一个强大的模板...通过"freemarker-test"这个压缩包文件,你可以实践以上知识,创建和运行Freemarker模板,逐步熟悉其语法和特性。同时,结合实际项目练习,加深对Freemarker的理解,提升你的开发技能。
综上所述,"freemarker插件"是为了提高Freemarker模板开发效率而设计的工具,通过它,开发者可以更好地管理和利用Freemarker模板,从而提升Web应用的开发效率和质量。通过阅读`freemarker.link`中的配置说明,可以...
1. **Freemarker模板语言**: Freemarker模板语言是Freemarker的核心,它由一系列指令、变量和控制结构组成。例如,`<#if>`用于条件判断,`<#foreach>`用于循环,`<#assign>`用于变量赋值,`<#function>`定义自定义...
1. 模板:Freemarker模板是HTML或者其他格式的文本文件,其中包含了Freemarker特定的指令和表达式,用来插入、控制或计算数据。 2. 数据模型:这是提供给Freemarker模板的数据源,通常由应用程序创建并传递给...
html`用于转义HTML特殊字符,`?replace`进行字符串替换,`?upper_case`和`?lower_case`进行大小写转换。此外,还有算术操作符(+、-、*、/、%)、比较操作符(==、!=、<、>、、>=)和逻辑操作符(&&、||、!)。 6. ...
html`(转义HTML特殊字符)、`?replace`(字符串替换)等,以及`<#list>`、`<#nested>`等指令,增强了模板的功能。 7. **模板继承和导入**: - FreeMarker支持模板继承,通过`<#import>`和`<@macro>`,可以创建可...
开发者可以编写FreeMarker模板,这些模板定义了页面的结构和样式,而实际的数据填充则由后端控制器处理。 以下是FreeMarker的一些核心概念和功能: 1. **模板语法**:FreeMarker使用简单的文本文件作为模板,其中...
Spring MVC的视图解析器可以自动将Controller返回的ModelAndView对象转换为FreeMarker模板。此外,还可以通过FreeMarker的自定义指令扩展功能,比如创建宏来复用模板代码。 对于初学者,理解FreeMarker的核心概念和...
- **数据模型**:Freemarker模板与应用程序的数据模型进行绑定,模型中的数据可以在模板中被引用和展示。 - **分离关注点**:Freemarker遵循MVC设计模式,负责视图部分,将业务逻辑和表现层分开,使代码更易于维护...
Freemarker模板由一系列指令和变量组成,这些元素结合了静态文本,可以根据给定的数据模型动态生成输出。例如,`<#if>`、`<#foreach>`等是控制流指令,用于条件判断和循环;`${}`用于显示变量值。 `freemarker.jar`...
在实际应用中,FreeMarker通常与MVC框架结合,通过控制器准备数据模型,然后将模型传递给FreeMarker模板,最后由FreeMarker生成动态内容。这种解耦使得开发者能够更高效地维护和扩展Web应用的视图层。 了解并熟练...
在FreeMarker模板中,可以使用`+`运算符来连接字符串。例如: ```html , "> !"> ${str1 + str2} ``` 这将输出:"Hello, World!" 2. **字符串格式化**: FreeMarker允许使用`printf`指令进行格式化输出,...
FreeMarker模板的特殊部分包括插值,如`${expression}`,它可以根据表达式的类型(字符串、数字、日期/时间或布尔值)进行不同的处理: - **文本插值**:在HTML文本中,FreeMarker会自动转义特殊字符。可以通过`...
FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯 Java 编写。FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序。虽然 FreeMarker 具有一些编程的能力,但通常由 ...
- `#autoesc`:自动转义HTML特殊字符,防止XSS攻击。 - `#function`:定义函数,类似于宏,但支持参数。 5. **表达式和逻辑运算** - 字符串连接:使用`~`符号连接字符串。 - 数学运算:支持加减乘除、取余、...