【发布时间】:2011-06-25 01:14:02
【问题描述】:
我目前正在使用 Jersey 库在 Java 中开发一个 RESTful Web 服务。
出于安全原因,我们需要一个类似于亚马逊简单存储服务的自定义身份验证。但是,这需要我计算正文的 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 被调用(就像我完全没有使用任何包装器一样)。
现在我确定我在这里做错了,但我真的对此了解不多,如果有人可以在这里帮助我,我会非常高兴:)
最好的问候, 卢卡斯
【问题讨论】:
-
是否记录了异常的原因?
-
我想你的意思是在 java.lang.IllegalStateException 之后通常会发生什么。不,它只是在 IllegalStateException 之后没有任何原因地出现。
-
您是否在处理过程中的任何时候直接访问响应输出流?
-
我正在从请求中访问 getReader()。回应我没碰。但是我发现问题在于转发包装器。我没有在我的问题中明确说明这一点,但我正在使用 tomcat 并尝试在阀门内使用上述代码。我仍然对这个问题是否也可以通过阀门感兴趣,因为这更适合 tomcat 模型。我现在已经开始使用一个不太好但有效的过滤器。
标签: java http request illegalstateexception