В настоящее время я разрабатываю RESTful Webservice на Java с использованием библиотеки Джерси.
В целях безопасности нам нужна пользовательская аутентификация, аналогичная Amazons Simple Storage Service.Это требует, однако, чтобы я вычислял хеш MD5 тела (если он есть) для аутентификации запроса.
До сих пор я использовал собственный Authenticator и Realm и включил их в свой контекст.При попытке вычислить хеш, я сначала использовал сам запрос, в результате чего возникла исключительная ситуация IllegalStateException, поскольку тело может быть прочитано только один раз.
После исследования проблемы я попытался обернуть запрос внутри HttpServletRequestWrapper, но не былпока успешно.
Я в основном использую оболочку, подобную показанной здесь: http://forums.oracle.com/forums/thread.jspa?threadID=2156814&tstart=0
Внутри моего царства, где я делаю аутентификацию, я сначала создаю оболочку следующим образом:
MyRequestWrapper requestWrapper = new MyRequestWrapper(request);
затем я вычисляю MD5 с помощью requestWrapper и, наконец, пересылаю его
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 вызывались раньше (как, например, я получал без использования какой-либо обертки).
Теперь я уверен, что здесь что-то не так, но я действительно неЯ не знаю много об этом и был бы очень рад, если бы кто-то мог помочь мне здесь:)
С наилучшими пожеланиями, Лукас