Skip to content


Uso de filtros en Java

Vamos a explicar por encima un mecanismo muy potente que se puede utilizar en el diseño modular de portales java, normalmente al desarrollar portales siguiendo un patrón MVC o utilizando algún Framework que lo implemente como Struts o Spring.

Siempre nos surge la necesidad de desarrollar la seguridad o controlar los “eventos” de navegación, para este caso existen los Filtros, un filtro permite que determinada petición o respuesta sea analizada bajo ciertas condiciones.

Una de las principales características de un filtro es que puede ser colocado en cualquier punto del flujo de la aplicación, ya sea entre una solicitud de JSP a JSP, Servlet a Servlet, o inclusive Servlet/JSP a HTML, la única condición que debe cumplirse es que debe existir un objeto de entrada (ServletRequest) y otro de salida (ServletResponse).

Ahora bien, solo queda pensar para que queremos usar nuestro filtro, su uso normal se suele aplicar para “tracear” el flujo de la aplicación con las llamadas que se van realizando, comprobar la sesión del usuario así como implementar la seguridad del portal.

A continuación vamos a mostrar un ejemplo de un filtro.


Primero debemos definir el filtro a utilizar, para ello construimos nuestra clase filtro que implementa en interface Filter:
[code lang=”java”]package es.crazyteam;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class FiltroUsuario implements Filter
{

private FilterConfig config;
private String urlLogin;

public void init(FilterConfig config) throws ServletException {
this.config = config;

//Tambien se pueden cargar los parametros
//Configura url desconexión
this.urlLogin = filterConfig.getInitParameter(“urlLogin”);
if (urlLogin == null || urlLogin.trim().length() == 0) {
//Error al cargar la url de login
throw new ServletException(“No se ha configurado URL de login”);
}
}

public void destroy() {
config = null;
}

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

chain.doFilter(request, response);

// Extraer Sesión
HttpSession session = ((HttpServletRequest)request).getSession();

if(session.getAttribute(“usuario”)==null)
{
//NO hay una session con ususario
RequestDispatcher dispatcher = request.getRequestDispatcher(“/”+urlLogin);
dispatcher.forward(request, response);
}

}
}
[/code]

Una vez definido nuestro Filtro solo tenemos que indicar en el web.xml donde aplicarlo:

[code lang=”xml”]


FiltroSesion
es.crazyteam. FiltroUsuario
urlLogin Login.jsp


FiltroSesion
/menu.jsp

[/code]

Aquí vemos en nuestro filtro como cuando invoquemos la url menu.jsp ira al filtro a comprobar si tenemos sesión, de no tenerla nos mostrará la página de login.

Con los filtros también hay que tener especial cuidado en no crear bucles, por ejemplo si en nuestro filtro definimos el patrón *.jsp cuando intentemos entrar a la página de login.jsp al pasar por el filtro verá que no tenemos sesión y nos intentará enviar otra vez a la misma página a lo que se volverá a aplicar el mismo filtro y entraremos en un bucle infinito. Para evitar esto bastará con tener cuidado con la aplicación de los filtros adecuándolos al flujo de la aplicación. O simplemente añadiendo una excepción en el filtro para nuestra página de login.

Posted in Java.

Tagged with , , .


8 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Maxi says

    Si en el filtro genero una excepción que en lugar de enviarte a una pagina de error, capturo esa excepción y se la envío a la página para que la imprima en pantalla. ¿Como se haría para pasar esa excepción?

  2. Jose says

    Saludos,

    pues no estoy seguro porque soy novato pero supongo que siempre puedes coger tu excepción y añadir ese objeto al request. Luego lo puedes recuperar fácilmente una vez estés en la otra página.

    Que alguien me diga si no estoy en lo cierto!

  3. juanjo says

    Creo que habría que cambiar:

    this.urlLogin = filterConfig.getInitParameter(“urlLogin”);

    por:

    this.urlLogin = config.getInitParameter(“urlLogin”);

    para que funcione.

    Un saludo

  4. Julian says

    Efectivamente, ya que el objeto a usar es el atributo del método.

  5. Bola says

    Hay que modificar tu doFilter y poner el chain en un else despues del IF para que funcione

  6. Claudia Cruz says

    como añado la excepción para que el filtro no tome la página de login?

Continuing the Discussion

  1. Resolviendo el control de acceso de usuarios utilizando HttpSession - Tutorial Java J2ee - Programar en Java linked to this post on 31 October 2013

    […] Aquí estoy definiendo una clase de servicio horizontal encargada de ofrecer una funcionalidad muy concreta al resto de la aplicación. Esta característica la vamos a poder explotar tanto en la solución que te estoy planteando hoy como en la próxima donde haré uso de un filtro web. […]



Some HTML is OK

or, reply to this post via trackback.