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»]
[/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.
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?
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!
Creo que habría que cambiar:
this.urlLogin = filterConfig.getInitParameter(“urlLogin”);
por:
this.urlLogin = config.getInitParameter(“urlLogin”);
para que funcione.
Un saludo
Efectivamente, ya que el objeto a usar es el atributo del método.
Hay que modificar tu doFilter y poner el chain en un else despues del IF para que funcione
como añado la excepción para que el filtro no tome la página de login?