doFilter не вызывается

Не могли бы вы помочь проверить, почему doFilter не вызывается

веб.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app
import org.springframework.web.filter.GenericFilterBean;
public class RoseFilter extends GenericFilterBean {
5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app
import org.springframework.web.filter.GenericFilterBean;
public class RoseFilter extends GenericFilterBean {
5.xsd" id="WebApp_ID" version="2.5"> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/log4j.properties</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> <filter> <filter-name>roseFilter</filter-name> <filter-class>net.paoding.rose.RoseFilter</filter-class> </filter> <filter-mapping> <filter-name>roseFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> </web-app>

подпись класса:

import org.springframework.web.filter.GenericFilterBean;
public class RoseFilter extends GenericFilterBean {

404 возвращается при вызове http://localhost:8080/hello/world, я устанавливаю точки останова в doFilter вроде doFilter не вызывается?(пробовал tomcat 6.0.18, 6.0.29, jdk1.6)


person e.b.white    schedule 07.09.2010    source источник
comment
Превращается ли /hello/world в ресурс для вашего сервера? Если нет, то нет причин запускать цепочку фильтров.   -  person rsp    schedule 07.09.2010
comment
Я почти уверен, что сам сталкивался с этим раньше, когда шаблон /* не работал. Я не думаю, что когда-либо решал это.   -  person skaffman    schedule 07.09.2010
comment
@rsp: ресурс не обязательно должен быть физическим существующим ресурсом. Фильтр (и сервлет), отображаемый на /*, будет вызываться в любом случае. Он может действовать как передний контроллер.   -  person BalusC    schedule 07.09.2010
comment
@BalusC, запускается ли цепочка фильтров, когда путь не соответствует ни одному сервлету или другому ресурсу, не относящемуся к фильтру? В web.xml указаны только прослушиватель и фильтр, и ничего больше.   -  person rsp    schedule 07.09.2010
comment
@rsp: Конечно. В противном случае фреймворки на основе фильтров (MVC), такие как Spring (MVC), никогда бы не работали.   -  person BalusC    schedule 07.09.2010


Ответы (2)


Фильтр не будет вызываться, если:

  1. Класс фильтра отсутствует в пути к классам и/или не может быть загружен или создан. Однако вы должны были заметить это в журналах запуска сервера. Решение должно быть найдено на основе интерпретации исключений/ошибок, обнаруженных в журналах сервера.

  2. Перед этим в цепочке запущен еще один фильтр, который не вызывает FilterChain#doFilter(), а RequestDispatcher#forward() или include(), из-за чего последующие фильтры в цепочке полностью пропускались ( когда они не слушают FORWARD или INCLUDE диспетчеров; по умолчанию они слушают только REQUEST диспетчера). Решение состоит в том, чтобы исправить неправильный фильтр, или добавить <dispatcher>FORWARD</dispatcher> и т. д. соответственно, или переупорядочить объявления фильтра в web.xml так, чтобы ваш новый фильтр располагался перед другим фильтром (вам, в свою очередь, нужно только убедиться, что ваш новый фильтр правильно использует FilterChain#doFilter() :)).

  3. URL-адрес запроса явно неверен. Вы использовали http://localhost:8080/hello/world. Если фильтр прослушивает /*, это означает, что контекст веб-приложения должен быть ROOT или как минимум /hello. Проверьте контекст веб-приложения. Я бы просто повторил попытку с URL-адресом, который указывает на действительный JSP/Servlet внутри того же веб-приложения, которое генерирует ответ, отличный от 404. Затем вызывается ли фильтр?

person BalusC    schedule 07.09.2010
comment
1. Класс фильтра хорош, так как initFilterBean вызывается правильно. - person e.b.white; 07.09.2010
comment
Я проверяю API destroy(): этот метод вызывается только после того, как все потоки в методе фильтра doFilter завершились или по истечении периода времени ожидания. Может, это тайм-аут? - person e.b.white; 07.09.2010
comment
Я добавил 3-ю причину (которая, в конце концов, довольно очевидна, но вы никогда не знаете :)). - person BalusC; 07.09.2010
comment
Я тоже так думаю BalusC. Как я сказал в своем ответе, его фильтр, вероятно, настроен на неправильный URL. - person CoolBeans; 07.09.2010
comment
@Coolbeans: ваш ответ, однако, не объяснил это таким образом и предлагает немного странное решение. - person BalusC; 07.09.2010
comment
Я согласен BalusC. Мой ответ не был подробно объяснен. - person CoolBeans; 07.09.2010
comment
Спасибо - у меня та же проблема, добавление ‹dispatcher›FORWARD‹/dispatcher› в filter-mapping решило мою проблему! - person lukass77; 08.06.2016
comment
@BalusC Огромное спасибо!!!! Следующее помогло мне ‹filter-mapping› ‹filter-name›Name-Of-Your-Filter‹/filter-name› ‹url-pattern›/*‹/url-pattern› ‹dispatcher›FORWARD‹/dispatcher› ‹/filter -отображение› - person suryakrupa; 30.06.2016
comment
Моя проблема решена, но проблема в сеансе. Моя сессия не поддерживается, что я могу для этого сделать - person BASEER HAIDER JAFRI; 26.03.2018

Как выглядит веб-запрос? Можете ли вы попробовать изменить шаблон URL-адреса на *.jsp вместо / * ? Если вы используете что-то отличное от чистого JSP, измените его на любое расширение запроса (например, для struts это обычно *.do).

person CoolBeans    schedule 07.09.2010