我们正在使用Apache Velocity生成HTML,我想将自己的转义添加到我们模板的所有输入中 - 而无需更改我们的模板。 Velocity似乎相当可扩展,但我很难找到解决方案的方法。
你知道是否有一些简单的方法来逃避输入而不改变我的所有模板?
答案 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);
}
});