Есть ли способ получить необработанный поток http-запросов из обработчика Java servlet?

#java #http #request

#java #http #запрос

Вопрос:

Я пытаюсь протоколировать необработанный http-запрос, поступающий в мое приложение. Мой Java-код находится внутри контроллера SpringMVC. У меня есть доступ к объекту «HttpServletRequest». Но я не смог найти способ получить из него необработанный поток http-запросов. Есть средство чтения, но оно считывает только содержимое post. Что я хочу, так это всю цепочку, URL, заголовки, тело. Есть ли простой способ сделать это?

Заранее спасибо.

Ответ №1:

Нет.

Сервлет не предоставляет такого API, и это было бы сложно реализовать, потому что (в принципе) вы не можете дважды прочитать одни и те же данные из сокета. Получить информацию о заголовке несложно, но необработанные заголовки невозможно захватить в контейнере сервлета. Чтобы получить тела, вам нужно захватить их самостоятельно, когда ваше приложение читает / записывает соответствующие потоки.

Ваши альтернативы:

  1. Напишите свою собственную реализацию HTTP-протокола на стороне сервера. (Вероятно, не подходит для вашего приложения.)

  2. Возможно, вам удастся получить необходимую информацию заголовка с помощью фильтров, хотя они не отображают необработанные запросы.

  3. В некоторых контейнерах сервлетов есть ведение журнала заголовка запроса; например, в Tomcat есть зверь, называемый RequestDumperValve, который вы можете настроить в своем «server.xml » файл.

  4. Внедрите прокси-сервер, который находится между клиентом и вашим «реальным» сервером.

  5. Прослушивание пакетов.

Что лучше всего зависит от того, чего вы действительно пытаетесь достичь.

ПРОДОЛЖЕНИЕ:

Если «ошибка» находится в заголовках, подход RequestDumperValve, вероятно, является лучшим для отладки. Перейдите к «$CATALINA_HOME/conf/server.xml «файл, найдите «RequestDumperValve» и раскомментируйте элемент. Затем перезапустите Tomcat. Вы также можете сделать аналогичный в вашем веб-приложении «context.xml » файл. По умолчанию сброшенные запросы и ответы попадают в «logs/catalina.out». Обратите внимание, что это приведет к большому объему выходных данных, поэтому вы не хотите делать это в рабочей среде … за исключением крайнего средства.

Если ошибка связана с содержимым запроса POST или PUT, вам нужно будет модифицировать ваше приложение, чтобы сохранить копию содержимого, когда оно считывает его из входного потока. Я не знаю никаких ярлыков для этого.

Кроме того, если вы хотите оставить вход в систему на длительное время, вам, вероятно, потребуется решить проблему самостоятельно, вызвав HttpServletRequest API и заголовки ведения журнала и т.д. RequestDumperValve генерирует слишком много выходных данных и сбрасывает ВСЕ запросы, а не только плохие.

Комментарии:

1. Спасибо за информацию. Чего я хочу добиться, так это просто регистрировать полный запрос при поступлении какой-либо ошибки / плохого запроса. Я сделаю то, что предложил nos.

Ответ №2:

Нет, сервлеты не предоставляют API для получения необработанного запроса — для этого вам может понадобиться сниффер, такой как wireshark.

Вы можете получить доступ к проанализированным заголовкам запроса и uri, хотя:

и т.д.

Комментарии:

1. На самом деле, мне сказали, что у ASP есть решение с его magic: Request. Серверные переменные[«ALL_RAW»], но это не Java-сервлет. Ну что ж.

Ответ №3:

Мне удалось прочитать мой необработанный запрос в моем веб-приложении, развернутом на Tomcat 5.5

Все, что мне нужно было сделать, это прочитать HttpServletRequest через мой контроллер servlet / Spring, используя только request.getInputStream().
Это должен быть первый подход API к запросу. прежде чем какой-либо фильтр или другая команда начнут массово обрабатывать запрос, что приведет к его полному считыванию веб-сервером.

В чем проблема с таким подходом?

Комментарии:

1. request.getInputStream() получит только тело запроса, а не заголовки. OP хотел «всю цепочку, URL, заголовки, тело».