mvc interceptores handlerinterceptoradapter annotation java spring spring-mvc spring-boot

java - interceptores - spring interceptor



Diferencia entre interceptor y filtro en Spring MVC (3)

Citando el javadoc de HandlerIntercepter :

HandlerInterceptor es básicamente similar a un Filter servlet, pero a diferencia de este último, solo permite el preprocesamiento personalizado con la opción de prohibir la ejecución del controlador y el postprocesamiento personalizado. Los filtros son más potentes, por ejemplo, permiten intercambiar los objetos de solicitud y respuesta que se transmiten por la cadena. Tenga en cuenta que un filtro se configura en web.xml , un HandlerInterceptor en el contexto de la aplicación.

Como directriz básica, las tareas de preprocesamiento relacionadas con el controlador de grano fino son candidatas para implementaciones de HandlerInterceptor , especialmente el código del controlador común y las verificaciones de autorización. Por otro lado, un Filter es adecuado para solicitar contenido y ver el manejo de contenido, como formularios multiparte y compresión GZIP. Esto normalmente muestra cuándo es necesario asignar el filtro a ciertos tipos de contenido (por ejemplo, imágenes) o a todas las solicitudes.

Con eso dicho:

Entonces, ¿dónde está la diferencia entre PostHandle () en Interceptor y doFilter () en Filter?

postHandle a postHandle después de la invocación del método del controlador, pero antes de que se visualice la vista. Por lo tanto, puede agregar más objetos de modelo a la vista, pero no puede cambiar HttpServletResponse , ya que ya se ha confirmado. 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 y posterior basada en 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 se debe usar?

Como dijo el documento, las tareas de preprocesamiento relacionadas con el controlador de grano fino son candidatos para implementaciones de HandlerInterceptor , especialmente el código de controlador común y las verificaciones de autorización. Por otro lado, un Filter es adecuado para solicitar contenido y ver el manejo de contenido, como formularios multiparte y compresión GZIP. Esto normalmente muestra cuándo es necesario asignar el filtro a ciertos tipos de contenido (por ejemplo, imágenes) o a todas las solicitudes.

Estoy un poco confundido sobre los propósitos de Filter e Interceptor .

Como entendí de los documentos, Interceptor se ejecuta entre solicitudes. Por otro lado, el Filter se ejecuta antes de mostrar la vista, pero después de que el controlador haya respondido.

Entonces, ¿dónde está la diferencia entre postHandle() en Interceptor y doFilter() en Filter?

¿Cuál es la mejor práctica en qué casos de uso se debe usar? En esta imagen, ¿dónde funcionan los Filter y los Interceptor ?


Un HandlerInterceptor le brinda un control más detallado que un filtro, porque tiene acceso al "controlador" de destino real; esto significa que cualquier acción que realice puede variar dependiendo de lo que la solicitud esté haciendo realmente (mientras que el filtro de servlet se aplica genéricamente a todas las solicitudes: solo se pueden tener en cuenta los parámetros de cada solicitud). HandlerInterceptor también proporciona 3 métodos diferentes, para que pueda aplicar el comportamiento antes de llamar a un controlador, después de que el controlador haya finalizado pero antes de la visualización de visualización (donde incluso puede omitir la visualización por completo), o después de que la vista se haya renderizado. Además, puede configurar diferentes interceptores para diferentes grupos de manejadores: los interceptores están configurados en handlerMapping y puede haber múltiples handlerMappings.

Por lo tanto, si necesita hacer algo completamente genérico (por ejemplo, registrar todas las solicitudes), entonces un filtro es suficiente, pero si el comportamiento depende del controlador de destino o si desea hacer algo entre el manejo de la solicitud y la representación de la vista, entonces el HandlerInterceptor proporciona esa flexibilidad.

Referencia: http://static.springframework.org/sp...ng-interceptor


Filtro : un filtro, como su nombre indica, es una clase Java ejecutada por el contenedor de servlet para cada solicitud HTTP entrante y para cada respuesta http. De esta manera, es posible administrar las solicitudes entrantes HTTP antes de que lleguen al recurso, como una página JSP, un servlet o una página estática simple; De la misma manera, es posible gestionar la respuesta saliente HTTP después de la ejecución del recurso.

Interceptor : - Los interceptores Spring son similares a los filtros de servlet pero actúan en contexto Spring, por lo que son muy potentes para gestionar la solicitud y respuesta HTTP, pero pueden implementar un comportamiento más sofisticado porque pueden acceder a todo el contexto Spring.