【问题标题】:Java Web Service HttpServletRequestWrapper Issue: IllegalStateExceptionJava Web 服务 HttpServletRequestWrapper 问题:IllegalStateException
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    相关资源
    最近更新 更多