我目前正在使用 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 被调用(就像我根本没有使用任何包装器一样)。
现在我确定我在这里做错了,但我对此真的不太了解,如果有人能在这里帮助我,我会非常高兴:)
最好的问候,卢卡斯