`
杨胜寒
  • 浏览: 286386 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

FreeMarker模板输出转义html

阅读更多

本文转载自: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("'", "&apos;");//替换单引号
html = html.replaceAll("&", "&amp;");//替换&
html = html.replace("\"", "&quot;"); // 替换双引号
html = html.replace("\t", "&nbsp;&nbsp;");// 替换跳格
html = html.replace(" ", "&nbsp;");// 替换空格
html = html.replace("<", "&lt;");//替换左尖括号
html = html.replaceAll(">", "&gt;");//替换右尖括号

 

本文转载自http://www.cnblogs.com/nixil/archive/2012/04/23/2466364.html,并稍作修改!

分享到:
评论

相关推荐

    FreeMarker模板基本语法

    ### FreeMarker模板基本语法 #### 一、FreeMarker概述与基本用法 **FreeMarker**是一种强大的、基于Java的模板引擎,主要用于动态生成HTML页面,但也支持其他类型的文本格式(如XML、JavaScript、电子邮件等)。它...

    freemarker模板使用

    html`用于转义HTML特殊字符,`?length`获取集合长度等。 3. **图片插入**: - 在Freemarker模板中插入图片,通常涉及两个步骤: - 将图片资源部署到服务器的静态资源目录,例如`/images/`。 - 在模板中通过相对...

    freemarker模板

    Freemarker模板是一种强大的、基于Java的开源模板引擎,用于生成动态内容。它主要用于Web应用程序,尤其是与Spring框架集成时,但也可用于任何需要将数据模型转化为文本输出的场景,如电子邮件生成、报告制作等。在...

    实用方便freemarker.jar freemarker架包 freemarker生成excel、word、html、xml例子

    通常,我们需要借助第三方库,如Apache POI,先将FreeMarker模板转换为HTML,然后再转换为Word或Excel。这种方式虽然多了一步,但依然能保持模板和数据的分离。 5. SpringMVC集成: 在SpringMVC框架中,可以通过...

    java使用Freemarker生成PDF以及HTML等文档.zip

    Freemarker 是一个强大的模板引擎,它允许开发者通过模板语言与数据模型相结合来生成文本输出,如 HTML、PDF 或其他文档格式。以下是关于这一主题的详细知识: 1. **Freemarker 概述**: - Freemarker 是一个开源...

    freemarker代码

    Freemarker是一个强大的模板...通过"freemarker-test"这个压缩包文件,你可以实践以上知识,创建和运行Freemarker模板,逐步熟悉其语法和特性。同时,结合实际项目练习,加深对Freemarker的理解,提升你的开发技能。

    freemarker插件

    综上所述,"freemarker插件"是为了提高Freemarker模板开发效率而设计的工具,通过它,开发者可以更好地管理和利用Freemarker模板,从而提升Web应用的开发效率和质量。通过阅读`freemarker.link`中的配置说明,可以...

    freemarker中文文档与包

    1. **Freemarker模板语言**: Freemarker模板语言是Freemarker的核心,它由一系列指令、变量和控制结构组成。例如,`&lt;#if&gt;`用于条件判断,`&lt;#foreach&gt;`用于循环,`&lt;#assign&gt;`用于变量赋值,`&lt;#function&gt;`定义自定义...

    freemarker中文手册

    1. 模板:Freemarker模板是HTML或者其他格式的文本文件,其中包含了Freemarker特定的指令和表达式,用来插入、控制或计算数据。 2. 数据模型:这是提供给Freemarker模板的数据源,通常由应用程序创建并传递给...

    FreeMarker手册-Freemarker 2.3.18

    html`用于转义HTML特殊字符,`?replace`进行字符串替换,`?upper_case`和`?lower_case`进行大小写转换。此外,还有算术操作符(+、-、*、/、%)、比较操作符(==、!=、&lt;、&gt;、、&gt;=)和逻辑操作符(&&、||、!)。 6. ...

    struts2中使用freeMarker

    html`(转义HTML特殊字符)、`?replace`(字符串替换)等,以及`&lt;#list&gt;`、`&lt;#nested&gt;`等指令,增强了模板的功能。 7. **模板继承和导入**: - FreeMarker支持模板继承,通过`&lt;#import&gt;`和`&lt;@macro&gt;`,可以创建可...

    FreeMarker文档.CHM

    开发者可以编写FreeMarker模板,这些模板定义了页面的结构和样式,而实际的数据填充则由后端控制器处理。 以下是FreeMarker的一些核心概念和功能: 1. **模板语法**:FreeMarker使用简单的文本文件作为模板,其中...

    freemarker实例

    Spring MVC的视图解析器可以自动将Controller返回的ModelAndView对象转换为FreeMarker模板。此外,还可以通过FreeMarker的自定义指令扩展功能,比如创建宏来复用模板代码。 对于初学者,理解FreeMarker的核心概念和...

    freemarker中文学习资料

    - **数据模型**:Freemarker模板与应用程序的数据模型进行绑定,模型中的数据可以在模板中被引用和展示。 - **分离关注点**:Freemarker遵循MVC设计模式,负责视图部分,将业务逻辑和表现层分开,使代码更易于维护...

    Freemarker教程及jar包

    Freemarker模板由一系列指令和变量组成,这些元素结合了静态文本,可以根据给定的数据模型动态生成输出。例如,`&lt;#if&gt;`、`&lt;#foreach&gt;`等是控制流指令,用于条件判断和循环;`${}`用于显示变量值。 `freemarker.jar`...

    FreeMarker手册.pdf

    在实际应用中,FreeMarker通常与MVC框架结合,通过控制器准备数据模型,然后将模型传递给FreeMarker模板,最后由FreeMarker生成动态内容。这种解耦使得开发者能够更高效地维护和扩展Web应用的视图层。 了解并熟练...

    Freemarker操作字符串

    在FreeMarker模板中,可以使用`+`运算符来连接字符串。例如: ```html , "&gt; !"&gt; ${str1 + str2} ``` 这将输出:"Hello, World!" 2. **字符串格式化**: FreeMarker允许使用`printf`指令进行格式化输出,...

    FreeMarker的基础知识整理

    FreeMarker模板的特殊部分包括插值,如`${expression}`,它可以根据表达式的类型(字符串、数字、日期/时间或布尔值)进行不同的处理: - **文本插值**:在HTML文本中,FreeMarker会自动转义特殊字符。可以通过`...

    Freemarker简介及标签详解大全

    FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯 Java 编写。FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序。虽然 FreeMarker 具有一些编程的能力,但通常由 ...

    freemarker操作手册-完整freemarker教程

    - `#autoesc`:自动转义HTML特殊字符,防止XSS攻击。 - `#function`:定义函数,类似于宏,但支持参数。 5. **表达式和逻辑运算** - 字符串连接:使用`~`符号连接字符串。 - 数学运算:支持加减乘除、取余、...

Global site tag (gtag.js) - Google Analytics