external image sT0I0Hv.jpgexternal image jW39aeI.jpg

Introducción

Los filtros permiten procesar la petición antes de llegar al servlet o la respuesta enviada por el servlet antes de ser devuelta. Ese comportamiento es un patrón de diseño típico: "patrón interceptor"
Tema 27 pag 304 libro en inglés; javadoc: http://docs.oracle.com/javaee/7/api/javax/servlet/Filter.html

external image N1IDJ5W.gif


external image 4hJS9D2.gif






Por ejemplo: se pueden incluir tareas comunes a varios servlets sin repetir el código en todos ellos, cambiar la clase que se ejecutará según la url, etc.

Tareas típicas para las que se usan filtros:
  • Autenticación - sólo ejecutar el servlet tras haber validado la identidad del usuraio.
  • Log - informar del estado de manera independiente al código de los servlets.
  • Cifrado
  • Compresión
  • Localización - Cambiar la representación de elementos (textos, números, fechas...)según el idioma o el locale del usuario.
  • Añadir un encabezado o un pie común a todas las páginas ( probado en clase)

Configuración


Dentro de nuestra aplicación web (war), La configuración de los filtros se hace en el "descriptor de despliegue" (web application deployment descriptor) webapp/WEB-INF/web.xml
Dentro de él, el orden (ANTIGUAMENTE)_obligatorio de las secciones de filtros y servlets era:
  1. filter
  2. filter-mapping
  3. servlet
  4. servlet-mapping

La primera sección <filter> especifica configuración de nombre, clase y parámetros. Es indiferente el orden en el que se declaren y configuren los filtros aquí.

El orden de aplicación de los filtros se establece en la sección <filter-mapping> , donde se asocia cada filtro configurado anteriormente con un patrón de urls que especifica las peticiones que se verán afectadas por cada filtro.

    <filter>
         <filter-name>filtroPrototype</filter-name>
         <filter-class>es.ap3.android.i18n.filtros.FiltroJavaScript</filter-class>
         <init-param>
             <param-name>libreria</param-name>
             <param-value>scripts/prototype.js</param-value>
         </init-param>
    </filter>
 
    <filter>
       Declaración de otro filtro...
    </filter>
 
    <filter-mapping>
         <filter-name>filtroJavaScript</filter-name>
         <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
 

...
Revisar para resumir lo aprovechable de estos enlaces:

http://www.javatutoriales.com/2012/06/struts-2-parte-6-interceptores.html
http://www.oracle.com/technetwork/java/interceptingfilter-142169.html
http://www.oracle.com/technetwork/java/filters-137243.html
http://stackoverflow.com/questions/16480321/wrapper-filter-and-servlet
http://technobcn.wordpress.com/2014/01/04/java-responseheaders-servlet-filter/
http://novacreations.net/usando-filtros-en-una-aplicacion-web-java/
http://book.javanb.com/servlets-and-javaserver-pages-the-j2ee_technology-web-tier/0321136497_ch08lev1sec1.html
http://stackoverflow.com/questions/2725102/how-to-use-a-servlet-filter-in-java-to-change-an-incoming-servlet-request-url
http://www.servletsuite.com/tips/aop.htm

Documentación de filtros con wrappers
http://www.oracle.com/technetwork/java/filters-137243.html
http://stackoverflow.com/questions/14736328/looking-for-an-example-for-inserting-content-into-the-response-using-a-servlet-f
http://www.java2s.com/Tutorial/Java/0400__Servlet/Filterthatusesaresponsewrappertoconvertalloutputtouppercase.htm