3

我们正在使用 Apache Velocity 生成 HTML,我想将我自己的转义添加到我们模板的所有输入中——而不更改我们的模板。Velocity 似乎相当可扩展,但我很难在框架中找到自己的方式。

您知道是否有一些简单的方法可以在不更改所有模板的情况下转义输入?

4

2 回答 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());
  }
});
于 2013-10-02T08:15:40.317 回答
2

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

根据 Velocity 2.1 的开发人员指南:您可以通过两种方式之一注册事件处理程序。注册事件处理程序的最简单方法是在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);
    }
});
于 2021-01-18T22:12:37.467 回答