Java Web服务HttpServletRequestWrapper问题:IllegalStateException

时间:2011-02-10 17:53:38

标签: java http request illegalstateexception

我目前正在使用Jersey库开发一个Java的RESTful Web服务。

出于安全考虑,我们需要一种类似于Amazons Simple Storage Service的自定义身份验证。但是,这需要我计算正文的MD5哈希值(如果有的话)来验证请求。

到目前为止,我已经使用了自定义Authenticator和Realm并将它们插入到我的上下文中。 在尝试计算哈希时,我首先使用请求本身导致IllegalStateException,因为正文只能被读取一次。

在调查问题之后,我试图将请求包装在HttpServletRequestWrapper中但到目前为止还没有成功。

我基本上使用的是这里显示的包装器: http://forums.oracle.com/forums/thread.jspa?threadID=2156814&tstart=0

在我的领域内,我进行身份验证,我首先创建包装器,如下所示:

MyRequestWrapper requestWrapper = new MyRequestWrapper(request);

然后我使用requestWrapper计算MD5 最后转发它

request.getRequestDispatcher("/*").forward(requestWrapper, response);

处理工作正常,但在此之后我收到如下错误:

Servlet.service() for servlet Jersey REST Service threw exception
java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:407)
    at com.sun.jersey.spi.container.servlet.WebComponent$Writer.finish(WebComponent.java:285)
    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:241)

请注意,之前没有提到过调用过的getReader或getInputStream(就像我没有使用任何包装器一样)。

现在我确定我在这里做错了但是我真的不太了解这个,如果有人可以帮助我,我会很高兴:)

最诚挚的问候, 卢卡斯

1 个答案:

答案 0 :(得分:1)

正如我对我的问题的评论所述:

  

我正在从请求中访问getReader()。回复我没有碰。但是我发现问题是转发包装器。我没有在我的问题中明确说明这一点,但我正在使用tomcat并试图在阀门内使用上面的代码。我仍然对这个问题感兴趣,如果这也可能来自阀门,因为这更适合tomcat模型。我现在已经开始使用一个不太好的过滤器,但是工作

然而,我发现这个解决方案非常好(使用过滤器)而不是tomcat阀。