sábado, 3 de octubre de 2015

Filtros en una aplicación web

Este es un post muy sencillo, pero no todo el mundo tiene porque saber hacerlo. Hoy indicaré como hacerlo y al final unos cuantos trucos para tener en cuenta. 

Para empezar indicaremos que es un Filtro, no es más que un otro componente JEE parecido a los Servlets, que puedes usar para interceptar las llamadas al servidor antes de que le lleguen a el y de que las responda al cliente. De esta forma tu puedes filtrar llamadas y ver por ejemplo si el usuario esta logado o no en la aplicación y evitar que acceda a determinadas URLs simplemente conociendo la URL. 

Estos filtros también se configuran en el fichero web.xml y se puede hacer de dos formas, o incluyendo la asociación con un determinado Servlet o indicado una determinada ruta y que filtre todos aquellos Servlets que usen el mismo patrón. Además en la configuración del Filtro también podemos indicar valores de configuración iniciales como en un Servlet. Ejemplo:

   BeerRequest
   com.example.web.BeerRequestFilter
   
      LogFileName
      UserLog.txt
   


   BeerRequest
   *.do


   BeerRequest
   EnterServlet

Una vez configurado para que se ejecute cuando queramos, vamos a crear el filtro. Para ello debemos crear una clase java en la ruta que hemos indicado anteriormente y además hacer que extienda de la interfaz Filter, para que así el servidor de aplicaciones sea capaz de reconocerla y poder manejarla. A igual también que los servlets tendrá un método 'init' donde podemos realizar configuraciones previas (aunque siempre se pone lo mismo) y un método 'destroy' (que siempre suele ir vacío). Aquí tenemos un ejemplo:

public class BeerRequest implements Filter {
 private FilterConfig fConfig;
 @Override
 public void init(final FilterConfig fConfig) throws ServletException {
  this.fConfig = fConfig;
 }
 @Override
 public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
  HttpServletRequest req = (HttpServletRequest) request;
  HttpServletResponse res = (HttpServletResponse) response;
  Usuario usuario = (Usuario) req.getSession().getAttribute("USUARIO_SESSION");
  if (usuario.is18YearsOld()) {
   chain.doFilter(request, response); // Continua hacia su destino original
  } else {
    res.sendRedirect("SinPermiso.jsp");
  }
 }
 @Override
 public void destroy() {
 }
}

Con esto podríamos filtrar todos los accesos a una determinada URL o un Servlet concreto. Aquí van las cuestiones extras que debéis tener en cuenta cuando vayáis a implementar filtros.
  • Se puede ejecutar más de un filtro en una llamada al servidor. Estos funcionarán como un pila LIFO.
  • El orden de ejecución de los filtros varia en dos principales causas:
    • Que coincida con la URL indicada en el 'filter-mapping'. Y dentro de todos los que coincidan, el orden en el cual se han configurado en el fichero web.xml.
    • Que coincida con el Servlet al que va dirigida la petición. Y dentro de aquellos que coincidan exactamente con el servlet, según se hayan configurado en el fichero web.xml.
  • En la configuración del 'filter-mapping' puedes configurar el parámetro 'dispatcher'. Para que el filtro solo se ejecute cuando la llamada al servidor sea del tipo indicado. Los tipos disponibles son: Request, Forward, Include y Error. 

No hay comentarios:

Publicar un comentario