HandlerInterceptor vs Filter en Spring
En esta entrada, HandlerInterceptor vs Filter en Spring, vamos a ver las diferencia entre HandlerInterceptor y filter en Spring. En muchas ocasiones necesitamos aplicar exclusiones de urls en nuestras aplicaciones y no tenemos dudas de usar HandlerInterceptor o Filter.
Vamos a intentar de resolver las dudas para aplicar HanlderInterceptor o Filter.
¿Qué es un Filtro en Spring?
En Spring, un «filter» (filtro) es un componente que se utiliza para interceptar y procesar solicitudes HTTP y respuestas antes de que lleguen a los servlets o después de que se generen. Los filtros son parte del patrón de diseño «Interceptor» y se utilizan comúnmente para realizar tareas de preprocesamiento y postprocesamiento en las solicitudes y respuestas HTTP.
Un filtro en Spring implementa la interfaz javax.servlet.Filter
, que tiene tres métodos principales:
init(FilterConfig config)
: Este método se llama una vez cuando se inicializa el filtro. Se utiliza para realizar cualquier configuración o inicialización necesaria antes de que el filtro comience a procesar las solicitudes.doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
: Este es el método principal del filtro y se llama cada vez que se recibe una solicitud. Aquí es donde se puede realizar el procesamiento necesario en la solicitud y/o respuesta antes de pasarla al siguiente filtro en la cadena o al servlet final.destroy()
: Este método se llama una vez cuando se destruye el filtro. Se utiliza para realizar cualquier limpieza o liberación de recursos antes de que el filtro se elimine.
Los filtros son una forma poderosa de agregar funcionalidad adicional a una aplicación web de Spring, como seguridad, registro, compresión, manejo de encabezados, etc. Se pueden configurar en el archivo web.xml
de la aplicación o utilizando anotaciones como @WebFilter
en aplicaciones basadas en Java Servlet 3.0+.
Los filtros en Spring permiten realizar tareas de preprocesamiento y postprocesamiento en las solicitudes y respuestas HTTP, lo que facilita la implementación de funcionalidades adicionales en una aplicación web.
¿Cómo se crea un filtro en Spring?
Para crear un filtro en Spring se una clase que implemente la interfaz javax.servlet.Filter
. Esta clase contendrá la lógica del filtro y debe implementar los métodos init
, doFilter
y destroy
.
Por ejemplo podemos crear un filtro de la siguiente manera:
@Component @Slf4j public class LogFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { log.info("In the filter"); chain.doFilter(request, response); } }
Una vez hemos visto los filtros en Spring, vamos a ver los HandlerInterceptor.
¿Qué es un HandlerInterceptor en Spring?
Un HandlerInterceptor en Spring es una interfaz que te permite interceptar y modificar solicitudes y respuestas en aplicaciones Spring MVC. Proporciona una forma de realizar tareas de preprocesamiento y posprocesamiento alrededor de la ejecución del controlador, como el registro, la autenticación, la autorización, la modificación de encabezados de solicitud/respuesta y más.
Los HandlerInterceptors se utilizan comúnmente para tareas como:
- Registro: Registrar los detalles de las solicitudes entrantes, las respuestas salientes o métodos de controlador específicos.
- Autenticación y autorización: Realizar verificaciones de autenticación o aplicar reglas de autorización antes de permitir el acceso a un método de controlador.
- Modificación de solicitud/respuesta: Modificar encabezados de solicitud/respuesta, agregar encabezados personalizados o alterar el cuerpo de la solicitud/respuesta.
- Manejo de errores: Manejar excepciones y asignarlas a respuestas de error apropiadas.
- Caché: Implementar mecanismos de almacenamiento en caché para mejorar el rendimiento.
- Auditoría: Realizar un seguimiento y registrar registros de auditoría para solicitudes y respuestas.
Al implementar la interfaz HandlerInterceptor, puedes definir los métodos preHandle, postHandle y afterCompletion que se ejecutarán en diferentes etapas del proceso de manejo de solicitudes. Estos métodos te permiten realizar lógica personalizada antes de que se ejecute el método de controlador, después de que se ejecute el método de controlador y después de que se envíe la respuesta al cliente, respectivamente.
Los HandlerInterceptors ofrecen una forma flexible de aplicar aspectos transversales al procesamiento de solicitudes de tu aplicación. Pueden registrarse globalmente para todas las solicitudes o aplicarse selectivamente a métodos de controlador o patrones de URL específicos utilizando configuraciones o anotaciones.
En resumen, los HandlerInterceptors en Spring ofrecen un mecanismo potente para interceptar y modificar el comportamiento del manejo de solicitudes en una aplicación Spring MVC.
¿Cómo crear un HandlerInterceptor en Spring?
Para crear un HandlerInterceptor en Spring debemos implementar la clase HandlerInterceptor en Spring.
Esta clase nos va a permitir hacer override de 3 métodos:
- preHandle: Se ejecuta antes del interceptor.
- postHandle: Se ejecuta después del interceptor.
- afterCompletetion: Después de completar la respuesta y la vista.
public class CustomHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // Lógica de preprocesamiento antes de que se ejecute el controlador return true; // Devuelve true si el procesamiento debe continuar, o false para detenerlo. } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // Lógica de posprocesamiento después de que se ejecuta el controlador, pero antes de la renderización de la vista. } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // Lógica después de completar la respuesta y la renderización de la vista. } }
Diferencia entre HandlerInterceptor y Filter en Spring
A continuación vamos a ver HandlerInterceptor vs Filter en Spring con sus principales diferencias.
La diferencia principal entre un HandlerInterceptor
y un Filter
en Spring radica en el nivel en el que operan y el momento en que se ejecutan durante el procesamiento de las solicitudes.
- Nivel de operación:
HandlerInterceptor
: Opera a nivel del framework Spring MVC y se centra en interceptar y modificar el procesamiento de las solicitudes entrantes antes y después de que se ejecute el controlador y se renderice la vista.Filter
: Opera a nivel del contenedor de servlets y se encarga de filtrar y modificar tanto las solicitudes entrantes como las respuestas salientes antes de que lleguen al framework Spring MVC.
- Momento de ejecución:
HandlerInterceptor
: Se ejecuta después de que el controlador se ha seleccionado para manejar la solicitud, pero antes de que se ejecute el método del controlador y se renderice la vista.Filter
: Se ejecuta antes de que el framework Spring MVC procese la solicitud y después de que se haya recibido en el contenedor de servlets.
En resumen, el HandlerInterceptor
se enfoca en aspectos específicos del procesamiento de solicitudes en el contexto de Spring MVC, como la manipulación de atributos de la solicitud, la autenticación, la autorización, el registro de tiempos de respuesta, etc. Por otro lado, el Filter
es más general y se utiliza para tareas más amplias de filtrado y transformación de solicitudes y respuestas en el nivel del contenedor de servlets.
Es importante considerar que tanto los HandlerInterceptor
como los Filter
pueden ser utilizados en conjunto para implementar diferentes capas de funcionalidad en una aplicación Spring, según los requisitos específicos.
Conclusión
En esta entrada hemos visto una comparación de uso de HandlerInterceptor vs Filter en Spring, para poder aplicar el más necesario en función de nuestras necesidades.