Как определить нестатические запросы tomcat - PullRequest
2 голосов
/ 02 апреля 2011

Я хотел бы добавить протоколирование запросов и ответов в веб-приложение Java, которое я запускаю в Tomcat 6. Мое веб-приложение обслуживает смесь статических файлов и динамического содержимого, генерируемого сервлетами.Я хочу регистрировать только те запросы и ответы, которые обрабатываются моими сервлетами.

Я подумал, что лучший способ реализовать ведение журнала - использовать фильтр для захвата входящего запроса HttpServletRequest и обернуть HttpServletResponse, чтобы разрешить ответсодержимое для захвата.

Есть ли способ указать в Tomcat Filter, какой сервлет будет обрабатывать входящий запрос HttpServletRequest?Лучшая идея, которая у меня была до сих пор, - это анализ файла web.xml и извлечение сопоставления из элементов в сервлеты.Затем я мог бы изучить путь входящего запроса, чтобы определить, какой сервлет его обработает.Если это не Tomcat DefaultServlet, я бы зарегистрировал запрос.

Это немного неловко, поскольку Tomcat уже выполнил весь этот анализ файла web.xml, поэтому я надеялся, что существует какой-то существующий API для запроса этой проанализированной информации.

1 Ответ

1 голос
/ 02 апреля 2011

Я работаю над Tomcat 7; и в то время как аннотации, новые для сервлетов 3.0 API, могут сделать это проще; все еще должно быть возможно сделать то, о чем вы говорите на Tomcat 6. Поскольку у вас есть базовая концепция фильтрации, я не буду ее охватывать, но вы должны быть в состоянии объявить свои сопоставления фильтров таким образом, чтобы они применяются только к конкретным сервлетам. Глядя на файл web.xml из примера, который я нашел здесь :

<filter>
   <display-name>Filter1</display-name>
   <filter-name>Filter1</filter-name>
   <filter-class>Filter1</filter-class>
 </filter>

 <filter-mapping>
   <filter-name>Filter1</filter-name>
   <url-pattern>/Filter1</url-pattern>
 </filter-mapping>

 <filter-mapping>
   <filter-name>Filter1</filter-name>
   <!-- declaring which servlet to filter here...... -->
   <servlet-name>Servlet1</servlet-name>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
   <dispatcher>INCLUDE</dispatcher>
   <dispatcher>ERROR</dispatcher>
 </filter-mapping>

Я надеюсь, что это работает. Я тоже работаю над фильтрами; так что, если это не даст мне знать, и я потрачу больше времени на изучение этого вопроса, так как я все равно должен сделать что-то подобное ...

...