如何转义Velocity模板的所有输入

时间:2013-10-02 07:50:35

标签: java html escaping velocity

我们正在使用Apache Velocity生成HTML,我想将自己的转义添加到我们模板的所有输入中 - 而无需更改我们的模板。 Velocity似乎相当可扩展,但我很难找到解决方案的方法。

你知道是否有一些简单的方法来逃避输入而不改变我的所有模板?

2 个答案:

答案 0 :(得分:5)

EventCartridge eventCartridge = new EventCartridge();
context.attachEventCartridge(eventCartridge);
eventCartridge.addReferenceInsertionEventHandler(new ReferenceInsertionEventHandler() {
  public Object referenceInsert(String reference, Object value) {
    return escaper.html(value.toString());
  }
});

答案 1 :(得分:1)

这可以通过 ReferenceInsertionEventHandler 实现来完成。

<块引用>

根据 Velocity 2.1 的 developer guide:您可以 以两种方式之一注册事件处理程序。最简单的方法 注册事件处理程序是在velocity.properties 中指定它们。 (以这种方式配置的事件处理程序被称为“全局” 事件处理程序)。例如,以下属性将转义 HTML 任何插入的引用中的实体。

event_handler.reference_insertion.class = org.apache.velocity.app.event.implement.EscapeHtmlReference

请注意,EscapeHtmlReference 已弃用。您应该提供自己的实现,可以以类似的方式加载。

或者,可以通过代码加载处理程序:

InternalEventContext context; // eg. VelocityContext

EventCartridge eventCartridge = new EventCartridge();
if (!eventCartridge.attachToContext(context)) {
    throw new RuntimeException("Velocity context does not support event cartridge");
}

eventCartridge.addReferenceInsertionEventHandler(new ReferenceInsertionEventHandler() {
    @Override
    public Object referenceInsert(Context context, String reference, Object value) {
        return escaper.escape(value);
    }
});