#java #http #request
#java #http #запрос
Вопрос:
Я пытаюсь протоколировать необработанный http-запрос, поступающий в мое приложение. Мой Java-код находится внутри контроллера SpringMVC. У меня есть доступ к объекту «HttpServletRequest». Но я не смог найти способ получить из него необработанный поток http-запросов. Есть средство чтения, но оно считывает только содержимое post. Что я хочу, так это всю цепочку, URL, заголовки, тело. Есть ли простой способ сделать это?
Заранее спасибо.
Ответ №1:
Нет.
Сервлет не предоставляет такого API, и это было бы сложно реализовать, потому что (в принципе) вы не можете дважды прочитать одни и те же данные из сокета. Получить информацию о заголовке несложно, но необработанные заголовки невозможно захватить в контейнере сервлета. Чтобы получить тела, вам нужно захватить их самостоятельно, когда ваше приложение читает / записывает соответствующие потоки.
Ваши альтернативы:
-
Напишите свою собственную реализацию HTTP-протокола на стороне сервера. (Вероятно, не подходит для вашего приложения.)
-
Возможно, вам удастся получить необходимую информацию заголовка с помощью фильтров, хотя они не отображают необработанные запросы.
-
В некоторых контейнерах сервлетов есть ведение журнала заголовка запроса; например, в Tomcat есть зверь, называемый RequestDumperValve, который вы можете настроить в своем «server.xml » файл.
-
Внедрите прокси-сервер, который находится между клиентом и вашим «реальным» сервером.
-
Прослушивание пакетов.
Что лучше всего зависит от того, чего вы действительно пытаетесь достичь.
ПРОДОЛЖЕНИЕ:
Если «ошибка» находится в заголовках, подход 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, заголовки, тело».