lunes, 18 de mayo de 2009

Filtros de javax.servlet

En este post se explica como crear un elemento que puede ser de gran utilidad para nuestras aplicaciones web como es el Filtro de la Interfaz javax.servlet.Filter. Con un filtro podemos indicar a nuestra aplicación web que realice una acción intermedia (que nosotros indiquemos como veremos a continuación) al flujo de trabajo de la aplicación.

Para explicar su funcionamiento vamos a suponer que tenemos una aplicación desarrollada bajo el framework Struts y en la que tenemos la siguiente estructura de ficheros y paquetería:

MiAplicacion
- src
- MiAplicacion.Action (Package)
- MyAction1 (Clase Action de Struts)
- MiAplicacion.ActionForm (Package)
- MyActionForm (Clase Action Form de Struts)
- WebContent
- jsp
- index.jsp (Pagina principal formulario con un campo de texto y un boton para enviar el valor del campo de texto al MyAction1, y que es recogido por MyActionForm)
- welcome.jsp (Pagina a la que se redirecciona despues de llamar a MyAction1 y si el filtro no altera el flujo de trabajo de la aplicación)
- mensaje.jsp (Pagina que se mostrará cuando se cumpla cierta condicion en el filtro)
- WEB-INF
- struts-config.xml
- web.xml

Suponiendo que el mapeo de los Action y Action Form es correcto (se realiza en el fichero struts-config) vamos a declarar nuestro filtro en el proyecto, a implementar su código y a indicar la acción que realiza cuando se ejecute el filtro.

Para ello, creamos una nueva clase (POJO) que implemente la interfaz javax.servlet.Filter,
(en mi caso en el paquete: MiAplicacion.Filters quedando la estructura como MiAplicacion.FIlters.MiFiltro). Puesto que es una interfaz, nuestro IDE nos pedirá que declaremos los métodos obligatorios que debe contener nuestra clase MiFiltro.

Observamos que entre los métodos existe uno que se llama doFilter que es el que contendrá el código donde se efectuará la acción del filtro:

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException{...}

Nuestro código, por no complicar el programa y puesto que no es lo relevante en este post, simplemente recibirá un parámetro con un valor entero de la petición http por request
lo comparará con cero y en caso de ser menor o mayor efectuará una u otra acción. A continuación se muestra más detalladamente:

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException
{
//EL siguiente codigo es necesario ya que los parametros no son HttpServlet sino Servlet

HttpServletResponse servletResponse =

(HttpServletResponse)response;

HttpServletRequest servletRequest =
(HttpServletRequest)request;

/*
Si el parametro enviado desde la jsp "index.jsp" es cero => se sigue
el flujo de trabajo normal de la aplicación como si no existiese filtro.
En cambio, si el parámetro contiene un valor distinto de cero => Se
redirecciona a la página "mensaje.jsp" alterando el flujo de trabajo de
la aplicación.
*/
if(request.getAttribute("parametro")!=null &&
request.getAttribute("parametro")==0)
{
chain.doFilter(request, response);
}
else
{
servletResponse.sendRedirect(servletRequest.getContextPath()+"/jsp/mensaje.jsp");
}

}//cierra método doFilter

Además de declarar nuestra clase del filtro e implementar el código que se va a ejecutar con el filtro, tenemos que indicar a la aplicación dónde va a ejecutarse nuestro filtro, es decir, en qué momento del flujo de trabajo queremos que se ejecute el código antes implementado. Para esto nos vamos al fichero web.xml e introducimos las siguientes etiquetas:


web-app
...

filter
filter-name mifiltro /filter-name
filter-class MiAplicacion.Filters.MiFiltro /filter-class
/filter

filter-mapping
filter-name mifiltro /filter-name
url-pattern *.do /url-pattern
/filter-mapping
...

Con estas etiquetas, por un lado declaramos la existencia de nuestro filtro en la aplicación (etiqueta filter con nombre del bean del filtro y clase del filtro), y por otro lado dónde queremos que se ejecute el filtro dentro del flujo de trabajo de nuestra aplicación(etiqueta filter-mapping con el nombre del bean del filtro al que hacemos referencia y url-pattern que indica que el filtro se ejecutará ANTES de cualquiera llamada a un fichero (loquesea=*)loquesea.do , es decir, un Action de nuestra aplicación).

Otra posible configuración podría ser poner en la etiqueta url-pattern el contenido *.jsp, coin lo que estariamos indicando que el filtro deberá ejecutarse ANTES de una llamada a un fichero de tipo loquesea.jsp, es decir una página jsp.

No hay comentarios:

Publicar un comentario