在 war 文件的 web.xml 运行 中的过滤器之前将 Jetty 配置为 运行 自定义过滤器

Configure Jetty to run a custom filter before filters in war file's web.xml run

我在 Jetty 服务器上 运行 有一个第三方 .war 文件。在 .war 文件的部署描述符 运行 中定义的过滤器之前,我需要 运行 用于记录目的的代码。代码需要能够访问传入请求和响应对象,以及 war.

中应用程序 运行 的记录器上下文

有没有办法在 Jetty 的 xml 配置文件中执行此操作?由于对许可的担忧,我不想触摸 war 文件。

我可以覆盖允许我添加自定义过滤器的部署描述符,但我相信这些会在 war 中的过滤器之后 运行。我也可以使用请求定制器,但这并不能让我访问我还需要编辑的响应。

我尝试在 运行 和 war 的 org.eclipse.jetty.webapp.WebAppContext 处理程序之前向 HandlerCollection 添加一个处理程序,但我似乎无法访问 Web 应用程序的记录器的上下文...

有什么办法吗?那么在 Web 应用程序的 servlet 执行之前 运行 一段可以访问传入请求和响应以及 Web 应用程序上下文的代码?

选项 1:

要在其生命周期的各个阶段访问原始 RequestResponse,请使用 HttpChannel.Listener(确保您阅读 javadoc/apidoc 以了解每个事件意味着)。

选项 2:

要在 WebAppContext 中添加处理程序,在 Session/Security 处理之前,但在其他处理程序之后,请使用 WebAppContext.insertHandler(HandlerWrapper).

选项 3:

创建一个代表您的 servlet Filterweb-fragment servlet jar,并将其添加到 WebAppContext.setExtraClassPath(String),它将被拾取并添加到实际的 webapp 的启动中。

选项 4:

创建一个自定义 RequestLog 实现(添加到 Server.setRequestLog(RequestLog),一旦请求和响应完成就会收到通知,因此您可以将 request/log 的状态记录到任何你想要的来源。

选项 5:

使用现有的 RequestLog 实现之一以您想要的格式将您想要的详细信息记录到控制台。 (看CustomRequestLog and Slf4jRequestLogWriter的组合)