¡Bienvenidos a todos! Esta publicación formará parte de una serie de 13 publicaciones que estaré desarrollando para aprender a desarrollar una aplicación web pura en Java bajo la plataforma JEE usando Servlets y JSPs. Este será un curso en forma de guía para aquellas personas que recién estén empezando en el mundo de la programación web y que todavía no hacen uso de ningún framework.
Haciendo uso de JSPs y Servlets construiremos nuestras aplicaciones webs los cuales se ejecutarán en Apahe Tomcat (Contenedor de Servlets), el cual lo usaremos como servidor de aplicaciones para ejecutar nuestro proyecto. Asimismo, usaremos Eclipse como herramienta IDE (Entorno de Desarrollo Integrado) para la edición y compilación de nuestro código.
Haciendo uso de JSPs y Servlets construiremos nuestras aplicaciones webs los cuales se ejecutarán en Apahe Tomcat (Contenedor de Servlets), el cual lo usaremos como servidor de aplicaciones para ejecutar nuestro proyecto. Asimismo, usaremos Eclipse como herramienta IDE (Entorno de Desarrollo Integrado) para la edición y compilación de nuestro código.
Clase 8a
Filtros en Aplicaciones Web JEE
Los filtros pueden trabajar en conjuntos con Servlets y JSPs, como sabemos, ellos permiten analizar y/o transformar tanto la información solicitada como la enviada en una petición web. Un filtro realiza su trabajo y pasa el control al siguiente filtro.
Mi primer Filtro
Mi primer Filtro
1. Creamos un proyecto web java en eclipse File>New>Dynamic Web Proyect.
2. Para nuestro primer ejemplo crearemos un servlet que redireccione a una página.
Registramos el servlet en el archivo descriptor web.xml.
Creamos la página index.jsp con un enlace que llame al servlet.
Si ejecutamos la consola imprimirá el mensaje:
> Primer Servlet
3. Creamos nuestro primer filtro
Registramos el filtro en el archivo web.xml que haga mapping al servlet que creamos anteriormente.
Ahora ejecutamos nuevamente el proyecto y la salida en consola de Eclipse será.
>Primer Filtro: Antes(Request)
>>>Primer Servlet
>Primer Filtro: Despues(Response)
4. Creamos nuestro segundo servlet y nuestro segundo filtro que haga mapping tanto a PrimerServlet y a SegundoServlet.
Ejecutamos nuevamente el proyecto y si damos clic en el enlace Primer Servlet tendremos la siguiente salida:
>Primer Filtro: Antes(Request)
>>Segundo Filtro: Antes(Request)
>>>Primer Servlet
>>Segundo Filtro: Despues(Request)
>Primer Filtro: Despues(Response)
Mientras que si damos clic al enlace Segundo Servlet tendremos esta salida:
>Segundo Filtro: Antes(Request)
>>Segundo Servlet
>Segundo Filtro: Despues(Request)
La ejecución de un filtro se divide en dos momentos: antes y después de invocar la cadena
5. Creamos un filtro que controle el ingreso de palabras que no serán admitidos, registramos el filtro en el archivo web.xml y creamos las páginas registraCliente.jsp, modificaCliente.jsp si se ingresa un dato invalido redirecciona a salida.jsp
Ejecutamos el proyecto y si los datos ingresados en el formulario son válidos tendremos:
>Filtro de Seguridad: Antes(Request)
>edad - 20
>apellido - Alcarraz
>nombre - jose
>Filtro de Seguridad: Después(Response)
De lo contrario tendremos la siguiente salida:
>Filtro de Seguridad: Antes(Request)
>edad - 20
>apellido - insert
Descargar ejercicios
Descargar archivo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package servlets; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class PrimerServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println( "Primer Servlet" ); request.getRequestDispatcher( "/index.jsp" ).forward(request, response); } } |
Registramos el servlet en el archivo descriptor web.xml.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!-- Establecer pagina de inicio --> < welcome-file-list > < welcome-file >index.jsp</ welcome-file > </ welcome-file-list > <!-- Registrar primer servlet --> < servlet > < description ></ description > < display-name >PrimerServlet</ display-name > < servlet-name >PrimerServlet</ servlet-name > < servlet-class >servlets.PrimerServlet</ servlet-class > </ servlet > < servlet-mapping > < servlet-name >PrimerServlet</ servlet-name > < url-pattern >/Primero</ url-pattern > </ servlet-mapping > |
Creamos la página index.jsp con un enlace que llame al servlet.
1 2 3 4 5 6 | < body bgcolor = yellow > < h2 > < font color = "green" >FILTROS</ font > </ h2 > < a href = "Primero" >Primer Servlet</ a > </ body > |
Si ejecutamos la consola imprimirá el mensaje:
> Primer Servlet
3. Creamos nuestro primer filtro
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package filtros; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class PrimerFiltro implements Filter { public PrimerFiltro() { } // Cuerpo del filtro public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Código previo a la cadena // Es el mejor lugar para modificar el request System.out.println( "Primer Filtro: Antes(Request)" ); // Invoca al metodo service del servlet y luego continua con el filtro chain.doFilter(request, response); // Entrega el control al próximo de la cadena // Código posterior a la cadena // Este es el mejor lugar para modificar la respuesta. System.out.println( "Primer Filtro: Despues(Response)" ); } // Permite realizar configuraciones iniciales public void init(FilterConfig fConfig) throws ServletException { } // Destruye variables y/o referencias al finalizar el filtro public void destroy() { } } |
Registramos el filtro en el archivo web.xml que haga mapping al servlet que creamos anteriormente.
1 2 3 4 5 6 7 8 9 10 11 | < filter > <!-- Definir el filtro --> < display-name >PrimerFiltro</ display-name > < filter-name >PrimerFiltro</ filter-name > < filter-class >filtros.PrimerFiltro</ filter-class > </ filter > < filter-mapping > <!-- Mappping a un servlet --> < filter-name >PrimerFiltro</ filter-name > < servlet-name >PrimerServlet</ servlet-name > </ filter-mapping > |
Ahora ejecutamos nuevamente el proyecto y la salida en consola de Eclipse será.
>Primer Filtro: Antes(Request)
>>>Primer Servlet
>Primer Filtro: Despues(Response)
4. Creamos nuestro segundo servlet y nuestro segundo filtro que haga mapping tanto a PrimerServlet y a SegundoServlet.
1 2 3 4 5 6 7 8 9 10 | package servlets; public class SegundoServlet extends HttpServlet { protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println( "Segundo Servlet" ); request.getRequestDispatcher( "/index.jsp" ).forward(request, response); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | package filtros; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class SegundoFiltro implements Filter { public SegundoFiltro() { } public void init(FilterConfig fConfig) throws ServletException { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { System.out.println( "Segundo Filtro: Antes(Request)" ); chain.doFilter(request, response); System.out.println( "Segundo Filtro: Despues(Request)" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <!-- Registrar segundo servlet --> < servlet > < description ></ description > < display-name >SegundoServlet</ display-name > < servlet-name >SegundoServlet</ servlet-name > < servlet-class >servlets.SegundoServlet</ servlet-class > </ servlet > < servlet-mapping > < servlet-name >SegundoServlet</ servlet-name > < url-pattern >/Segundo</ url-pattern > </ servlet-mapping > <!-- Registrar segundo filtro para el primer y segundo servlet --> < filter > < display-name >SegundoFiltro</ display-name > < filter-name >SegundoFiltro</ filter-name > < filter-class >filtros.SegundoFiltro</ filter-class > </ filter > < filter-mapping > < filter-name >SegundoFiltro</ filter-name > < servlet-name >PrimerServlet</ servlet-name > </ filter-mapping > < filter-mapping > < filter-name >SegundoFiltro</ filter-name > < servlet-name >SegundoServlet</ servlet-name > </ filter-mapping > |
1 2 3 4 5 6 7 | < body bgcolor = yellow > < h2 > < font color = "green" >FILTROS</ font > </ h2 > < a href = "Primero" >Primer Servlet</ a > < a href = "Segundo" >Segundo Servlet</ a > </ body > |
Ejecutamos nuevamente el proyecto y si damos clic en el enlace Primer Servlet tendremos la siguiente salida:
>Primer Filtro: Antes(Request)
>>Segundo Filtro: Antes(Request)
>>>Primer Servlet
>>Segundo Filtro: Despues(Request)
>Primer Filtro: Despues(Response)
Mientras que si damos clic al enlace Segundo Servlet tendremos esta salida:
>Segundo Filtro: Antes(Request)
>>Segundo Servlet
>Segundo Filtro: Despues(Request)
La ejecución de un filtro se divide en dos momentos: antes y después de invocar la cadena
5. Creamos un filtro que controle el ingreso de palabras que no serán admitidos, registramos el filtro en el archivo web.xml y creamos las páginas registraCliente.jsp, modificaCliente.jsp si se ingresa un dato invalido redirecciona a salida.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package filtros; import java.io.IOException; import java.util.Enumeration; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class FiltroSeguridad implements Filter { // Arreglo que contiene las palabras que no serán admitidos por el filtro String[] sqls = { "insert" , "delete" , "update" , "drop" }; // Metodo que busca y retorna si existe o no el termino en el arreglo public boolean existe(String cad) { if (!cad.isEmpty()) { for (String x : sqls) { if (x.indexOf(cad) != - 1 ) // Si encontro la cadena return true ; } return false ; } else { return false ; } } public FiltroSeguridad() { } public void init(FilterConfig fConfig) throws ServletException { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException { System.out.println( "Filtro de Seguridad: Antes(Request)" ); Enumeration<string> params = request.getParameterNames(); while (params.hasMoreElements()) { String paramName = (String) params.nextElement(); String paramValue = request.getParameter(paramName); System.out.println(paramName + " - " + paramValue); if (existe(paramValue)) { request.getRequestDispatcher( "/salida.jsp" ).forward(request,response); return ; } } chain.doFilter(request, response); System.out.println( "Filtro de Seguridad: Despues(Response)" ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 | <!-- Registrar filtro Seguridad --> < filter > < display-name >FiltroSeguridad</ display-name > < filter-name >FiltroSeguridad</ filter-name > < filter-class >filtros.FiltroSeguridad</ filter-class > </ filter > < filter-mapping > <!-- Definir el patrón de recursos para el filtro --> < filter-name >FiltroSeguridad</ filter-name > < url-pattern >*.do</ url-pattern > < dispatcher >REQUEST</ dispatcher > </ filter-mapping > |
1 2 3 4 5 6 7 8 9 | < body bgcolor = yellow > < h2 > < font color = "green" >FILTROS</ font > </ h2 > < a href = "Primero" >Primer Servlet</ a > < a href = "Segundo" >Segundo Servlet</ a > < a href = "RegistraCliente.jsp" >Filtro Seguridad</ a > < a href = "RegistraProducto.jsp" >Filtro Seguridad</ a > </ body > |
1 2 3 4 5 6 7 8 9 10 | < body bgcolor = red > < h2 > Registra Cliente</ h2 > < form action = "cliente.do" > Nombre< input type = "text" name = "nombre" > Apellidos< input type = "text" name = "apellido" > Edad< input type = "text" name = "edad" > < input type = "submit" value = "Enviar" > </ form > </ body > |
1 2 3 4 5 6 7 8 9 10 | < body > < h2 > Registra Producto</ h2 > < form action = "producto.do" > Nombre< input type = "text" name = "nombre" > Precio< input type = "text" name = "precio" > Stock< input type = "text" name = "stock" > < input type = "submit" value = "Enviar" > </ form > </ body > |
1 2 3 4 | < body bgcolor = green > < h2 > No se admite este tipo de operación</ h2 > </ body > |
Ejecutamos el proyecto y si los datos ingresados en el formulario son válidos tendremos:
>Filtro de Seguridad: Antes(Request)
>edad - 20
>apellido - Alcarraz
>nombre - jose
>Filtro de Seguridad: Después(Response)
De lo contrario tendremos la siguiente salida:
>Filtro de Seguridad: Antes(Request)
>edad - 20
>apellido - insert
Descargar ejercicios
Descargar archivo
No hay comentarios, ¡cuéntame algo!
Me gustaría saber tu opinión. ¡Saludos!