2010-09-07 18 views
6

Podría ayudar a verificar por qué no conseguir doFilter llamadoFilter no conseguir llama

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> 

clase de firma:

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

404, mientras que se devuelve la llamada http://localhost:8080/hello/world, me establecer los puntos de ruptura en doFilter, parece doFilter no llama? (probé Tomcat 6.0.18, 6.0.29, jdk1.6)

+1

¿'/ hello/world' se convierte en un recurso para su servidor? Si no, no hay razón para comenzar una cadena de filtros. – rsp

+2

Estoy bastante seguro de haberlo encontrado antes, con el patrón '/ *' no funcionando. No creo que alguna vez lo haya resuelto. – skaffman

+0

@rsp: el recurso no necesariamente tiene que ser un recurso físico existente. El filtro (y el servlet) mapeados en '/ *' se invocarán de todos modos. Puede ser que actúe como un controlador frontal. – BalusC

Respuesta

21

El filtro no se invocará cuando:

  1. clase El filtro no se encuentra en la ruta de clase y/o no se puede cargar o crear instancias. Sin embargo, debería haberlo notado en los registros de inicio del servidor. La solución se encuentra en función de la interpretación de las excepciones/errores encontrados en los registros del servidor.

  2. Hay otro filtro en funcionamiento antes en la cadena que no está llamando FilterChain#doFilter(), sino más bien RequestDispatcher#forward() o include() que causó los filtros posteriores de la cadena ser completamente omitido (cuando no escuchan en FORWARD o INCLUDE despachadores, sino que por predeterminado solo escucha en el despachador REQUEST). La solución consiste en reparar el filtro incorrecto o agregar <dispatcher>FORWARD</dispatcher>, etc., o reorganizar las declaraciones de filtro en web.xml para que su nuevo filtro sea antes de el otro filtro (a su vez, solo debe asegurarse de que su nuevo filtro esté usando el FilterChain#doFilter() correctamente :)).

  3. La solicitud de URL es simplemente erróneo. Usaste http://localhost:8080/hello/world. Con un filtro de escucha en /*, esto significa que el contexto de aplicación web debe ser root o al menos /hello. Verifica tu contexto de webapp. Me gustaría volver a intentar con una URL que apunta a un JSP/Servlet válido dentro de la misma aplicación web que genera una respuesta que no es 404. ¿El filtro luego se llama también?

+0

1. La clase de filtro es buena ya que initFilterBean se llama correctamente. –

+0

2. He actualizado web.xml, compruebe. –

+0

Compruebo la API destroy(): este método solo se invoca una vez que todos los subprocesos dentro del método doFilter del filtro han salido o después de que ha pasado un tiempo de espera. Tal vez es tiempo de espera? –

0

Lo que la solicitud Web parece? Se puede tratar de cambiar su url-pattern a * .jsp en lugar de/*? Si está utilizando algo que no sea JSP puro, cámbielo a lo que sea que sea la extensión final de la solicitud (como para los struts, generalmente es * .do).