2009-08-24 13 views
20

El objeto javax.servlet.Filter se puede usar tanto para la autenticación (donde el filtro debe capturar la solicitud antes de que se deba realizar algún trabajo de servlet) como para la traducción XSLT (donde el servlet debe estar completamente terminado de generar contenido). ¿Cuándo se ejecuta realmente?¿Se ejecuta doFilter() antes o después de finalizar el trabajo del servlet?

Sé que esto depende de la implementación (en el contenedor web), pero este parece ser un problema que todos deben resolver.

¿Tal vez hay una opción de configuración establecida en algún lugar para cada registro de filtro con el contenedor web?

adicional:

Además, lo que gobierna el orden de ejecución de filtro? ¿Por qué se ejecutará FooFilter antes de BarFilter?

+0

El orden de ejecución de filtro se podría ser proporcionada en el archivo web.xml utilizando el . El contenedor interceptará el flujo de trabajo del programa con los filtros provistos comenzando de arriba hacia abajo. –

Respuesta

43

La cadena de filtros, en esencia, envuelve la invocación del servlet. La cadena procesará todos los enlaces hasta que llegue al "fondo", luego permitirá que el servlet se ejecute, y luego regresará la cadena en reversa. Por ejemplo, si usted tiene un nuevo "filtro de ejemplo", el método() doFilter puede tener este aspecto:

public void doFilter(ServletRequest request, 
     ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 
// do pre-servlet work here 
chain.doFilter(request, response); 
// do post servlet work here 

} 
+0

Esto puede ser un poco artificial, pero ¿y si quiero rechazar la respuesta? En otras palabras, quiero evitar que la respuesta realmente se apague? ¿Es aquí donde podría arrojarse una ServletException? –

+1

Lanzar una ServletException aún devolvería una "respuesta" al cliente, por lo que dependería de lo que quiso decir al no devolver una respuesta. Puede crear un nuevo objeto de respuesta, con solo el contenido que especifique y devolverlo si así lo desea. –

+0

Ah, buen punto. Absolutamente ninguna respuesta realmente nunca es deseable. Incluso cuando el doFilter() vuelve antes de llamar a chain.doFilter(), todavía devuelve otra página de error o algo predeterminado u otro. –

0

@Rich: ¿Es doFilter() ejecuta antes o después del trabajo del servlet se hace?

Un filtro es un programa que se ejecuta en el servidor antes de que el servlet o página JSP con el que está asociado.

+0

¿De dónde proviene esa cita? –

+0

Parece que se cita de "Más Servlets y JavaServer Pages" de Marty Hall. –

+0

@adatapost dado que envuelve la invocación, se invocará antes del servlet/jsp, pero recuperará el control después de que se procese (si otro filtro no interrumpió el procesamiento) –

7

alt text http://img228.imageshack.us/img228/8945/filter.png

Sobre la orden: como recuerdo del envase especificación servlet no garantiza que los filtros serán llamados en algún orden.

+2

"Los filtros se invocan en el orden en que aparecen las asignaciones de filtro en la lista de mapeo de filtro de un WAR. Usted especifica una lista de mapeo de filtro para un WAR en su descriptor de despliegue que codifica la lista a mano con XML. "Referencia: http://docs.oracle.com/javaee/6/tutorial/doc /bnagb.html –

+3

Tu enlace de imagen está roto. – Bob

-1

De acuerdo con el filtro de especificación servlet2.3 se realiza de acuerdo a la configuración web.xml de la secuencia de mapeo del Filtro Ref- http://www.programering.com/a/MTMyADOwATI.html

+0

Si bien esto podría responder teóricamente a la pregunta, [sería preferible] (// meta.stackoverflow.com/q/8259) incluir aquí las partes esenciales de la respuesta y proporcionar el enlace de referencia. –

Cuestiones relacionadas