Saltar al contenido

¿Qué es OncePerRequestFilter?

Solución:

¿En qué circunstancias se puede ejecutar un filtro más de una vez por solicitud?

Podría tener el filtro en la cadena de filtros más de una vez.

La solicitud podría enviarse a un servlet diferente (o el mismo) utilizando el despachador de solicitudes.


Un caso de uso común es Spring Security, donde la funcionalidad de autenticación y control de acceso generalmente se implementa como filtros que se ubican frente a los servlets de la aplicación principal. Cuando una solicitud se envía utilizando un despachador de solicitudes, tiene que pasar por la cadena de filtros nuevamente (o posiblemente por una diferente) antes de llegar al servlet que se ocupará de ella. El problema es que algunas de las acciones del filtro de seguridad solo deben realizarse una vez para una solicitud. De ahí la necesidad de esta filtrar.

Para comprender el papel de OncePerRequestFilter, primero debemos comprender claramente cómo se comporta un filtro normal. Cuando desee que se ejecute un código específico justo antes o después de la ejecución del servlet, cree un filtro que funciona como:

code1   ===>   servlet execution (using chain.doFilter())   ===>    code2

Entonces, code1 se ejecuta antes del servlet y code2 después de la ejecución del servlet. Pero aquí, mientras se ejecuta el servlet, puede haber alguna otra solicitud a un servlet diferente y ese servlet diferente también tiene este mismo filtro. En este caso, este filtro se ejecutará nuevamente.

OncePerRequestFilter previene este comportamiento. Para nuestra única solicitud, este filtro se ejecutará exactamente una vez (ni más ni menos). Este comportamiento es muy útil al trabajar con autenticación de seguridad.

¿En qué circunstancias se puede ejecutar un filtro más de una vez por solicitud?


Se puede invocar un filtro como parte de un REQUEST o envíos ASYNC que ocurren en subprocesos separados. Deberíamos usar OncePerRequestFilter ya que estamos haciendo una llamada a la base de datos para recuperar el principal o el usuario autenticado, no tiene sentido hacer esto más de una vez. Después de eso, configuramos el principal en el contexto de seguridad.

Authentication auth = jwtTokenProvider.getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(auth);

donde jwtTokenProvider es su servicio para obtener autenticación del token jwt.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *