Usando Filtros en Spring Boot #
Los filtros en Spring Boot son una forma de interceptar, redirigir y modificar las solicitudes HTTP antes de que lleguen a los controladores, y también para manipular las respuestas antes de que se envíen al cliente. Esto es útil para una variedad de tareas, como autenticación, logging, y modificación de solicitudes o respuestas. Pueden aplicarse a todas las urls, o a urls específicas.
En Spring Boot, los filtros se implementan generalmente mediante la interfaz Filter.
Cómo funciona #
Actúa como un middleware entre el servidor web de spring, y el DispatcherServlet. Al realizar una solicitud, el cliente envía una solicitud al servidor del spring, y ahí entra en acción el filtro. Al terminar la cadena de filtros, el DispatcherServlet de Spring recibe la solicitud. Cada filtro de dicha cadena puede operar sobre la solicitud o la respuesta, por ejemplo modificando los encabezados o verificando la autenticación. El orden en que se aplican los filtros se puede especificar en la configuración de la aplicación. Si es una response, el proceso es exactamente igual, pero a la inversa.
Métodos #
En versiones anteriores era obligatorio sobreescribir estos dos métodos, pero ahora son opcionales:
init:Se sobreescribe la implementación por defecto cuando es necesaria alguna tarea previa, como acceso a algún recurso.destroy: Se sobreescribe la implementación por defecto cuando por ejemplo es necesario liberar recursos…doFilter: el filtro recibe como argumentos un objeto con la solicitud o la respuesta y la cadena de filtros.
Creación de un Filtro en Spring Boot #
- Implementa la interfaz
Filter:
Crea una clase que implemente la interfazFilter. Aquí puedes definir el comportamiento que deseas aplicar a las solicitudes o respuestas.
@Component
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Inicialización del filtro, si es necesario
}
@Override
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
// Código con la implementación de la lógica del filtro
// Continúa con la siguiente entidad en la cadena de filtros
chain.doFilter(request, response);
}
@Override
public void destroy() {
// Limpieza del filtro, si es necesario
}
}
- Registrar el Filtro:
Puedes registrar el filtro en tu aplicación Spring Boot de dos formas principales:
- Usando
@Component: Si usas la anotación, como en el anterior ejemplo, el filtro se registrará automáticamente. En este caso, se aplicará a todas las peticiones.
- Manualmente en una clase
@Configuration, lo que permite más granularidad como definir urls específicas.
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean<CustomFilter> loggingFilter() {
FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new CustomFilter());
registrationBean.addUrlPatterns("/api/*"); // URL donde se aplicará el filtro
return registrationBean;
}
}
OncePerRequestFilter #
Hasta ahora, hemos visto cómo operan los filtros de Spring. Cuando ocurre una solicitud, esta pasa por una cadena de filtros hasta el DispatcherServlet. Si hay múltiples servlets, tener copias separadas del filtro para cada servlet puede llevar a ejecuciones redundantes de filtros. Para resolver esto, Spring ofrece una clase específica llamada OncePerRequestFilter. Esto previene posibles operaciones redundantes.
Orden de Ejecución de Filtros #
En aplicaciones con múltiples filtros, el orden de ejecución puede ser importante. Puedes establecer el orden de los filtros:
- Usando el método setOrder(int order) en el FilterRegistrationBean si lo registras manualmente. Los filtros con un valor de orden más bajo se ejecutarán antes.
- Utilizando la anotación @Order(1), @Order(2)…