如何从Velocity模板中转义全部输入

3
我们正在使用Apache Velocity生成HTML,我想在不更改模板的情况下为所有输入添加自己的转义。Velocity似乎很容易扩展,但我很难找到自己的方式。您是否知道是否有一些简单的方法可以转义输入而不改变所有模板?
2个回答

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

你把这个放在哪里? - Koray Tugay
这里的上下文是什么?是指ServletContext吗? - Koray Tugay

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

According to the developer guide for Velocity 2.1: ou may register event handlers in either of two manners. The easiest way to register event handlers is to specify them in velocity.properties. (Event handlers configured in this manner are referred to as "global" event handlers). For example, the following property will escape HTML entities in any inserted reference.

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);
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接