3

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

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

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

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

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

4

2 回答 2

1

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

希望它可以帮助你。

蒂埃里

于 2013-03-14T14:22:48.030 回答
0

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

于 2014-04-01T15:36:14.513 回答