Веб-служба Java HttpServletRequestWrapper Проблема: IllegalStateException - PullRequest
1 голос
/ 10 февраля 2011

В настоящее время я разрабатываю 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 вызывались раньше (как, например, я получал без использования какой-либо обертки).

Теперь я уверен, что здесь что-то не так, но я действительно неЯ не знаю много об этом и был бы очень рад, если бы кто-то мог помочь мне здесь:)

С наилучшими пожеланиями, Лукас

1 Ответ

1 голос
/ 22 февраля 2012

Как указано в моем комментарии к моему вопросу:

Я обращался к getReader () из запроса. Ответа я не трогал. Однако я обнаружил, что проблема заключалась в пересылке оболочки. Я не указал это явно в своем вопросе, но я использую tomcat и пытался использовать вышеуказанный код внутри клапана. Меня все еще интересует вопрос, возможно ли это и с помощью клапана, так как он лучше вписывается в модель кота. Теперь я перешел к использованию фильтра, который не так хорош, но работает

Однако я обнаружил, что это решение довольно неплохое (с использованием фильтра) вместо клапана кота.

...