1

我目前正在使用 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 被调用(就像我根本没有使用任何包装器一样)。

现在我确定我在这里做错了,但我对此真的不太了解,如果有人能在这里帮助我,我会非常高兴:)

最好的问候,卢卡斯

4

1 回答 1

1

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

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

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

于 2012-02-21T20:29:19.533 回答