1

私は現在、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については言及されていないことに注意してください(ラッパーをまったく使用せずに取得したように)。

今、私はここで何か間違ったことをしていると確信していますが、私はこれについてあまりよく知りません。誰かがここで私を助けてくれたら本当にうれしいです:)

よろしく、ルーカス

4

1 に答える 1

1

私の質問に対する私のコメントで述べられているように:

リクエストからgetReader()にアクセスしていました。応答しませんでした。しかし、問題はラッパーの転送にあることがわかりました。私は質問でこれを明示的に述べていませんでしたが、Tomcatを使用しており、バルブ内で上記のコードを使用しようとしました。これがTomcatモデルによりよく適合するので、これがバルブからも可能かどうかという質問にまだ興味があります。私は今、あまり良くないが機能するフィルターを使用するようになりました

ただし、Tomcatバルブの代わりに、このソリューションが(フィルターを使用して)非常に優れていることがわかりました。

于 2012-02-21T20:29:19.533 に答える