私は現在、Jerseyライブラリを使用してJavaでRESTfulWebサービスを開発しています。
セキュリティ上の理由から、Amazons SimpleStorageServiceと同様のカスタム認証が必要です。ただし、これには、リクエストを認証するために、本文のMD5ハッシュ(存在する場合)を計算する必要があります。
これまで、カスタムAuthenticatorとRealmを使用して、それらをコンテキストにプラグインしました。ハッシュを計算しようとすると、最初にリクエスト自体を使用した結果、本文は1回しか読み取れないため、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については言及されていないことに注意してください(ラッパーをまったく使用せずに取得したように)。
今、私はここで何か間違ったことをしていると確信していますが、私はこれについてあまりよく知りません。誰かがここで私を助けてくれたら本当にうれしいです:)
よろしく、ルーカス