2011-02-10 81 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閥門。