如何将servlet过滤器中的信息传递给Restlet ServerResource子类?

时间:2013-02-24 08:52:52

标签: servlets servlet-filters restlet restlet-2.0

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

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

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

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

我还将ServerAdapter子类化为将servlet请求属性复制到统一请求:来自ServletAdaptor.toRequest()的直接复制/粘贴。这也有效。

2 个答案:

答案 0 :(得分:1)

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

希望它对你有所帮助。

亨利

答案 1 :(得分:0)

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