🛡️ 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

Entradas populares de este blog

Configurando Servlets y JSP en Jetty

Firma de un Documento XML con Certificado Digital en Java para Uso Tributario en Chile

RESOLUCION SET BASICO DE FACTURA ELECTRÓNICA SII