Desde HandlerIntercepter
's javadoc :
HandlerInterceptor
es básicamente similar a un Servlet Filter
, pero a diferencia de este último, solo permite el preprocesamiento personalizado con la opción de prohibir la ejecución del propio controlador y el posprocesamiento personalizado. Los filtros son más potentes, por ejemplo, permiten intercambiar los objetos de solicitud y respuesta que se transmiten en la cadena. Tenga en cuenta que un filtro se configura en web.xml
, a
HandlerInterceptor
en el contexto de la aplicación.
Como pauta básica, las tareas de preprocesamiento detalladas relacionadas con el controlador son candidatas para HandlerInterceptor
implementaciones, especialmente el código de controlador común factorizado y las comprobaciones de autorización. Por otro lado, a Filter
es adecuado para solicitudes de contenido y visualización de contenido, como formularios de varias partes y compresión GZIP. Por lo general, esto muestra cuando se necesita asignar el filtro a ciertos tipos de contenido (por ejemplo, imágenes) oa todas las solicitudes.
Con eso dicho:
Entonces, ¿dónde está la diferencia entre Interceptor#postHandle()
y
Filter#doFilter()
?
postHandle
se llamará después de la invocación del método del controlador, pero antes de que se represente la vista. Por lo tanto, se puede añadir más objetos del modelo a la vista, pero puede no cambiar el HttpServletResponse
puesto que ya está comprometido.
doFilter
es mucho más versátil que el postHandle
. Puede cambiar la solicitud o respuesta y pasarla a la cadena o incluso bloquear el procesamiento de la solicitud.
Además, en los métodos preHandle
y postHandle
, tiene acceso al HandlerMethod
que procesó la solicitud. Por lo tanto, puede agregar lógica de procesamiento previo / posterior según el controlador en sí. Por ejemplo, puede agregar una lógica para los métodos de controlador que tienen algunas anotaciones.
¿Cuál es la mejor práctica en qué casos de uso debería utilizarse?
Como dijo el documento, las tareas de preprocesamiento detalladas relacionadas con el controlador son candidatas para HandlerInterceptor
implementaciones, especialmente el código de controlador común factorizado y las comprobaciones de autorización. Por otro lado, a Filter
es adecuado para solicitudes de contenido y visualización de contenido, como formularios de varias partes y compresión GZIP. Por lo general, esto muestra cuando se necesita asignar el filtro a ciertos tipos de contenido (por ejemplo, imágenes) oa todas las solicitudes.