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:
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:BeerRequest com.example.web.BeerRequestFilter LogFileName UserLog.txt BeerRequest *.do BeerRequest EnterServlet
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