【问题标题】:How can I pass information from a servlet filter into a Restlet ServerResource subclass?如何将信息从 servlet 过滤器传递到 Restlet ServerResource 子类?
【发布时间】:2013-02-24 08:52:52
【问题描述】:

在 Jetty 托管的 web 应用程序中,我使用 servlet 过滤器从 URL 中提取信息,有时将请求路由到非 Restlet servlet。对于 Restlet servlet,我希望能够将信息传递给我的 ServerResource 子类,并且我认为我应该能够通过将信息存储在 HttpServletRequest 的属性中来做到这一点。 (Restlet 是否支持不同的机制来实现这一点?我在“Restlet in Action”或 stackoverflow 上找不到任何内容。)

ServletAdapter 将 servlet 请求属性复制到 Restlet HttpRequest 的属性中,但它的构造函数采用 ServletContext 参数,而不是像超类(和默认适配器)ServerAdaptor 这样的 Context 参数——它不会复制 servlet 请求属性——所以我无法使用 ServletAdapter 解决问题。

javadoc for HttpServerHelper,由 ServerServlet.createServer() 实例化,声称将名为“适配器”的上下文参数设置为 ServerAdapter 子类的类名将导致 HttpServerHelper 使用指定的类,但在我的调试中,我可以看到“适配器”上下文参数不存在于通过 ServerServlet.createServer() 中的伪服务器传递给 HttpServerHelper 构造函数的子上下文中,尽管它在父上下文中。这在我看来像一个错误:AFAICT,由于子上下文不携带其父级的属性或参数,因此当前实现的 HttpServerHelper 永远不会看到指示它使用非默认适配器的参数。如果子上下文中不存在 HttpServerHelper.getHelpedParameters() 可能应该从其“帮助”服务器上下文的父上下文中添加“适配器”参数? (此修复也适用于 HttpServerHelper javadoc 中提到的其他参数:“useForwardedForHeader”。)

作为一种解决方法,我扩展了 ServerServlet.createServer() 以将“适配器”参数复制到它传递给 HttpServerHelper 的子上下文中。这行得通。

我还对 ServerAdapter 进行了子类化,以将 servlet 请求属性复制到统一请求:从 ServletAdaptor.toRequest() 直接复制/粘贴。这也有效。

【问题讨论】:

    标签: servlets servlet-filters restlet restlet-2.0


    【解决方案1】:

    也许一种解决方法是实现另一个 servlet 过滤器,为 servlet 和 restlet 环境提供全局上下文。此上下文可以存储在 ThreadLocal 中。在您的 restlet 资源中,您可以访问此上下文和您的参数...

    希望对你有所帮助。

    蒂埃里

    【讨论】:

    【解决方案2】:

    这是由issue 741 引起的,将在 Restlet Framework 2.3m2 中提供修复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多