2010-09-07 2 views
6

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

web.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_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_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)

+1

Реализует ли '/ hello/world' ресурс для вашего сервера? Если нет, нет причин начинать цепочку фильтров. – rsp

+2

Я уверен, что раньше я сталкивался с этим, когда шаблон '/ *' не работал. Я не думаю, что когда-либо это разрешаю. – skaffman

+0

@rsp: ресурс необязательно должен быть физическим существующим ресурсом. Фильтр (и сервлет), отображаемый на '/ *', будет вызываться в любом случае. Он может действовать как фронт-контроллер. – BalusC

ответ

21

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

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

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

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

+0

1. Класс фильтра хорош, так как initFilterBean вызывается правильно. –

+0

2. Я обновил web.xml, пожалуйста, проверьте. –

+0

Я проверяю API-интерфейс destroy(): этот метод вызывается только после того, как все потоки в методе doFilter фильтра вышли или по прошествии периода ожидания. Может быть, это таймаут? –

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^