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 retorna true, la ejecución continúa; si retorna false, 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 @ResponseBody o ResponseEntity, la respuesta se escribe y se compromete dentro del HandlerAdapter, antes de que se llame a postHandle.

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 ResponseBodyAdvice y registrarla como un @ControllerAdvice bean, o configurarla directamente en el RequestMappingHandlerAdapter.

Esto te permite interceptar y modificar el body de la respuesta justo antes de que se envíe al cliente, incluso cuando se usa @ResponseBody o ResponseEntity

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.