Control de sesión de una aplicación JSP basada en los filters del web.xml
Cuando creamos una aplicación web en la cual tenemos que mantener en la sesión datos del usuario que realiza “login“, una de las tareas que siempre tenemos que hacer es la de proporcionar la seguridad necesaria a cada página para que en el caso de que la sesión se haya perdido no se pueda acceder al contenido solicitado.
Una de las opciones para conseguir este objetivo es incluir en cada una de las páginas el siguiente fragmento de código:
<jsp:include page="comprobarSesion.jsp"></jsp:include> |
cuyo contenido puede ser uno parecido a este:
<% String nombre=(String)session.getAttribute("usuario"); if(nombre==null){ response.sendRedirect("index.html"); } %> |
Con esta solución conseguimos lo que queriamos, pero tendremos que añadir a todas nuestras páginas el anterior código.
Otra solución para conseguir exactamente lo mismo es basarnos en las directivas “filters” del web.xml. Con esta directiva conseguimos que se ejecute un script siempre que se llame a una serie de páginas (uris) que cumplan un determinado patrón.
Un ejemplo de configuración de una directiva “filter” de un fichero “web.xml” puede ser el siguiente:
<filter> <filter-name>filtroSeguridad</filter-name> <filter-class>FiltroSeguridad</filter-class> <init-param> <param-name>paginaError</param-name> <param-value>/errores/error.jsp</param-value> </init-param> <init-param> <param-name>paginaFinSesion</param-name> <param-value>/errores/nosesion.jsp</param-value> </init-param> </filter> <filter-mapping> <filter-name>filtroSeguridad</filter-name> <url-pattern>aplicacion/*</url-pattern> </filter-mapping> |
Aquí estamos indicándole al servidor de aplicaciones que se ejecute la clase FiltroSeguridad antes de servir cualquier página que se encuentre dentro del directorio “aplicacion”. La clase FiltroSeguridad la podéis ver a continuación:
public class FiltroSeguridad implements Filter { private FilterConfig config = null; private HashMap map = null; String paginaError = null; String paginaFinSesion = null; String paginaError2 = null; public String getExtension(String fichero) { String extension = null; String s = fichero; int i = s.lastIndexOf('.'); if (i > 0 && i < s.length() - 1) { extension = s.substring(i+1).toLowerCase(); } return extension; } public void destroy( ) { config = null; } public void init( FilterConfig config ) throws ServletException { this.config = config; String delimitador = ","; paginaError = config.getInitParameter("paginaError"); paginaFinSesion = config.getInitParameter("paginaFinSesion"); Enumeration e = config.getInitParameterNames( ); map = new HashMap( ); if( paginaError == null ) throw new ServletException("Por favor, proporcione " + " el parametro 'paginaError'."); while( e.hasMoreElements() ) { String element = (String)e.nextElement( ); String linea_props = (String)config.getInitParameter( element ); String[] props = linea_props.split(delimitador); map.put(element,props); } } /** Proceso Principal del filtro. */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException { String uri =((HttpServletRequest)request).getRequestURI(); HttpSession sesion = null; boolean todoBien = false; boolean redireccionado = false; try{ if (request instanceof HttpServletRequest) { sesion = ((HttpServletRequest)request).getSession(); } if (sesion.getAttribute("usuario")!= null){ chain.doFilter( request, response ); todoBien = true; }else{ /*Se ha perdido de la sesion el Usuario */ ((HttpServletResponse)response).sendRedirect( paginaFinSesion ); redireccionado = true; } }catch( javax.servlet.ServletException je ) { Throwable t = je.getRootCause( ); System.out.println( "Filtro: Excepcion: "+t.getMessage( ) ); t.printStackTrace( ); } catch(Exception ex){ System.out.println( "Error al acceder a: "+uri ); System.out.println( "Filtro: "+ex.getMessage( ) ); ex.printStackTrace(); throw new ServletException( "Estoy en el Filtro pidiendo: " + ""+ uri+"<br/>"+ex.getMessage()); } }//fin metodo }//fin clase |
El método al que llama el servidor de aplicaciones es el método “doFilter“. En él podemos realizar todas las comprobaciones de sesión que necesitemos, y redireccionar al usuario a la página de error que estimemos si hemos detectado que la sesión ha caducado.
La configuración de los filtros da mucho juego. Algo interesante es la opción de poder mapear varios directorios a un mismo control de sesión:
<filter-mapping> <filter-name>filtroSeguridad</filter-name> <url-pattern>/aplicacion1/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>filtroSeguridad</filter-name> <url-pattern>/aplcacion2/*</url-pattern> </filter-mapping> |