2011-02-10 64 views
1

我目前正在使用Jersey库开发Java中的RESTful Web服务。Java Web服务HttpServletRequestWrapper问题:IllegalStateException

出于安全原因,我们需要一种类似于亚马逊简单存储服务的定制认证。然而,这需要我计算身体的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); 

的凝固酶原ssing工作正常,但我之后获得类似这样的错误:

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的提之前被调用(比如我不使用任何包装的话)。

现在我相信我在这里做一些错误的,但我真的不知道很多关于这一点,将是非常高兴,如果有人可以帮助我在这里:)

最好的问候, 卢卡斯

+0

该异常是否有*原因*记录? – 2011-02-10 18:39:56

回答

1

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

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

但是我发现这个解决方案相当不错(使用过滤器)而不是tomcat阀门。