🛡️ Implementando un Filtro de Autenticación en una Aplicación Web Java
En el desarrollo de aplicaciones web seguras, es esencial contar con mecanismos que restrinjan el acceso a ciertas rutas si el usuario no está autenticado. Una forma eficaz de lograrlo es mediante filtros (Filter
) en Java EE o Jakarta EE. En este artículo veremos cómo implementar un filtro de autenticación sencillo y cómo integrarlo tanto en un despliegue tradicional como en un entorno embebido con Jetty.
💡 Ejemplo práctico: AuthFilter.java
package com.egga.appventas.filters;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class AuthFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Inicialización si es necesario
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
if (httpRequest.getSession().getAttribute("loginauth") == null) {
httpResponse.sendRedirect(httpRequest.getContextPath() + "/login");
} else {
chain.doFilter(request, response);
}
}
@Override
public void destroy() {
// Limpieza si es necesario
}
}
⚙️ ¿Cómo se registra el filtro?
🧩 Opción 1: En un web.xml
(despliegue clásico)
<filter>
<filter-name>AuthFilter</filter-name>
<filter-class>com.egga.appventas.filters.AuthFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthFilter</filter-name>
<url-pattern>/secured/*</url-pattern>
</filter-mapping>
🚀 Opción 2: Jetty embebido (desde código Java)
package com.egga.appventas;
import com.egga.appventas.cliprov.ListCliProv;
import com.egga.appventas.cliprov.SelectCliProv;
import com.egga.appventas.empresa.ListarEmpresa;
import com.egga.appventas.empresa.SeleccionEmpresa;
import com.egga.appventas.filters.AuthFilter;
import com.egga.appventas.login.LoginServlet;
import com.egga.appventas.posmovil.Boleta;
import com.egga.appventas.posmovil.PosMovil;
import com.egga.appventas.producto.BuscaProductoCod;
import com.egga.appventas.producto.BuscaProductoNom;
import com.egga.appventas.producto.ListProducto;
import com.egga.appventas.producto.ProductoServlet;
import com.egga.appventas.producto.SeleccionProducto;
import com.egga.appventas.stock.ConsultaStock;
import com.egga.appventas.web.IndexServlet;
import com.egga.appventas.web.RootRedirectServlet;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.FilterHolder;
import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.webapp.WebAppContext;
public class Appventas {
public static void main(String[] args) throws Exception {
// Crear una instancia del servidor en el puerto 8080
Server server = new Server(8080);
// Configurar el contexto web para JSP y servlets
WebAppContext context = new WebAppContext();
context.setContextPath("/AppVentas");
String resourceBase = Appventas.class.getClassLoader().getResource("static").toExternalForm();
if (resourceBase == null) {
throw new IllegalStateException("No se encontró el directorio de recursos estáticos.");
}
context.setResourceBase(resourceBase);
context.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false");
context.setParentLoaderPriority(true); // Configurar para que Jetty use su propio ClassLoader para servlets
/* SIRVO LOS RECURSOS ESTATICOS */
context.addServlet(DefaultServlet.class, "/css/*");
context.addServlet(DefaultServlet.class, "/scripts/*");
/*
context.addServlet(DefaultServlet.class, "/images/*");
context.addServlet(DefaultServlet.class, "/messageview/*");
*/
/* DECLARO LOS SERVLETS DE LOGIN, INDEX Y CONTEXTO RAIZ */
ServletHolder loginServlet = new ServletHolder(new LoginServlet());
context.addServlet(loginServlet, "/login");
ServletHolder indexservlet = new ServletHolder(new IndexServlet());
context.addServlet(indexservlet, "/index");
ServletHolder rootRedirectServlet = new ServletHolder(new RootRedirectServlet());
context.addServlet(rootRedirectServlet, "/");
/* DECLARO EL FILTRO QUE VERIFICA SI ESTÁ AUTENTIFICADO O NO */
FilterHolder authFilter = new FilterHolder(new AuthFilter());
context.addFilter(authFilter, "/secured/*", null);
/* DECLARO LOS SERVLETS RESTANTES */
ServletHolder listarempresaServlet = new ServletHolder(new ListarEmpresa());
context.addServlet(listarempresaServlet, "/secured/listarempresa");
ServletHolder seleccionempresaServlet = new ServletHolder(new SeleccionEmpresa());
context.addServlet(seleccionempresaServlet, "/secured/seleccionempresa");
ServletHolder boletaServlet = new ServletHolder(new Boleta());
context.addServlet(boletaServlet, "/secured/boleta");
ServletHolder posmovil = new ServletHolder(new PosMovil());
context.addServlet(posmovil, "/secured/posmovil");
ServletHolder consultastock = new ServletHolder(new ConsultaStock());
context.addServlet(consultastock, "/secured/consultastock");
/* SERVLETS QUE MANEJAN LOS PRODUCTOS */
/* SERVLET DE QUE LANZA EL MAESTRO DE PRODUCTO */
ServletHolder productoServlet = new ServletHolder(new ProductoServlet());
context.addServlet(productoServlet, "/secured/producto");
/* SERVLET QUE SELECCIONA EL PRODUCTO */
ServletHolder seleccionproductoServlet = new ServletHolder(new SeleccionProducto());
context.addServlet(seleccionproductoServlet, "/secured/seleccionarProducto");
/* LSITAR PRODUCTOS */
ServletHolder listproductoServlet = new ServletHolder(new ListProducto());
context.addServlet(listproductoServlet, "/secured/listarProducto");
/* busqueda por codigo de producto */
ServletHolder buscaproductocodServlet = new ServletHolder(new BuscaProductoCod());
context.addServlet(buscaproductocodServlet, "/secured/buscaproductocod");
/* busqueda por nombre de producto */
ServletHolder buscaproductonomServlet = new ServletHolder(new BuscaProductoNom());
context.addServlet(buscaproductonomServlet, "/secured/buscaproductonom");
/* busqueda por nombre de producto */
ServletHolder listcliprov = new ServletHolder(new ListCliProv());
context.addServlet(listcliprov, "/secured/listcliprov");
ServletHolder selectcliprov = new ServletHolder(new SelectCliProv());
context.addServlet(selectcliprov, "/secured/selectcliprov");
// Agregar el contexto web al servidor
server.setHandler(context);
// Iniciar el servidor
server.start();
server.join();
}
}
Nota: Cada vez que un usuario intente acceder a una URL dentro del contexto
/secured/
(por ejemplo, /secured/urlservlet
), si no ha iniciado sesión correctamente, será redirigido automáticamente al formulario de login para ingresar sus datos de autenticación.
✅ Conclusión
El uso de filtros como AuthFilter
es una solución eficaz y ligera para controlar el acceso en aplicaciones Java. Si bien en entornos tradicionales se configura en web.xml
, con Jetty embebido puedes hacerlo directamente desde el código.
Comentarios
Publicar un comentario