Incerception
Incerception
Todas las implementaciones de HandlerMapping soportan handler interception, lo cual es útil cuando quieres aplicar funcionalidad común a través de múltiples requests.
Un HandlerInterceptor puede implementar lo siguiente:
preHandle(..)— Callback que se ejecuta antes del handler real. Retorna un boolean: si retornatrue, la ejecución continúa; si retornafalse, se detiene la cadena de ejecución y no se llama al handler.postHandle(..)— Callback que se ejecuta después de que el handler se ha ejecutado.afterCompletion(..)— Callback que se ejecuta una vez que la request ha finalizado por completo, incluyendo la renderización de la vista si aplica.
Este tipo de interceptores son muy útiles para lógica como logging, auth checks, métricas, etc.
❕ Note Para métodos de controlador que usan
@ResponseBodyoResponseEntity, la respuesta se escribe y se compromete dentro del HandlerAdapter, antes de que se llame apostHandle.Eso significa que ya es demasiado tarde para modificar la respuesta, por ejemplo, si quieres agregar un header extra.
Para esos casos, puedes implementar una clase que extienda
ResponseBodyAdvicey registrarla como un @ControllerAdvice bean, o configurarla directamente en elRequestMappingHandlerAdapter.Esto te permite interceptar y modificar el body de la respuesta justo antes de que se envíe al cliente, incluso cuando se usa
@ResponseBodyoResponseEntity
Consulta la sección de Interceptors en la configuración de MVC para ver ejemplos de cómo configurar interceptores.
También puedes registrarlos directamente usando los setters en implementaciones individuales de HandlerMapping.
❗Warning
Los Interceptors no son la mejor opción como capa de seguridad, ya que puede haber desajustes con el path matching de los controladores anotados (por ejemplo, con
@RequestMapping).En general, se recomienda usar Spring Security, o alternativamente un enfoque similar que esté integrado con la cadena de filtros del Servlet, aplicado lo más temprano posible en el ciclo de la request.
Esto asegura una seguridad más robusta y coherente, especialmente en aplicaciones más complejas.