Есть ли способ получить необработанный поток HTTP-запросов из обработчика сервлетов Java? - PullRequest
2 голосов
/ 03 декабря 2009

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

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

Ответы [ 3 ]

5 голосов
/ 03 декабря 2009

Нет.

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

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

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

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

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

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

  5. Пакет нюхает.

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

Followup:

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

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

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

3 голосов
/ 03 декабря 2009

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

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

и т.д.

0 голосов
/ 29 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...