Implementando e Configurando Filtros (Filters) no Spring Boot

O Filter é um componente da especificação Servlet do JavaEE, localizado no pacote javax.servlet. Ele atua interceptando requisições HTTP antes que elas cheguem ao Servlet de destino, permitindo que um ou mais filtros processem o fluxo.

Essa funcionalidade é amplamente utilizada em ambientes de produção para diversas finalidades, como:

  • Modificação de requisições e respostas;
  • Prevenção contra ataques XSS (Cross-Site Scripting);
  • Empacotamento de fluxos binários para permitir leituras múltiplas.
  1. Criando um Filter Personalizado

Para criar um filtro, basta implementar a interface javax.servlet.Filter. A interface possui três métodos: init(), doFilter() e destroy(). Os métodos init() e destroy() possuem implementações padrão, restando apenas a obrigatoriedade de sobrescrever o doFilter().

É crucial lembrar que, para que a requisição continue seu fluxo normal, a invocação de chain.doFilter() é obrigatória.

public class RequestInterceptorFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        System.out.println("Executando RequestInterceptorFilter");
        // É obrigatório invocar chain.doFilter() para prosseguir com a requisição
        chain.doFilter(req, res);
    }
}
  1. Registrando o Filter no Contexto do Spring

Existem três abordagens principais para registrar filtros personalizados no contêiner IoC do Spring Boot. Cada uma possui suas próprias características e limitações.

Abordagem 1: Utilizando @Component e @Order

A maneira mais direta é anotar a classe do filtro com @Component e, opcionalmente, @Order para definir a precedência.

@Component
@Order(1)
public class RequestInterceptorFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        System.out.println("Executando RequestInterceptorFilter");
        chain.doFilter(req, res);
    }
}

Esta abordagem é extremamente simples e permite controlar a ordem de execução (valores menores executam primeiro; o padrão é Integer.MAX_VALUE). No entanto, ela não permite filtrar URLs específicas, interceptando todas as requisições da aplicação.

Abordagem 2: Utilizando @WebFilter e @ServletComponentScan

Para restringir a atuação do filtro a caminhos específicos, pode-se usar a anotação @WebFilter. Para que o Spring Boot reconheça essa anotação, é necessário adicionar @ServletComponentScan na classe principal da aplicação, indicando o pacote onde os filtros estão localizados.

@WebFilter(urlPatterns = "/api/*")
public class ApiSecurityFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        System.out.println("Processando filtro de segurança da API");
        chain.doFilter(req, res);
    }
}
@SpringBootApplication
@ServletComponentScan(basePackages = "com.example.app.filters")
public class ApplicationBootstrap {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationBootstrap.class, args);
    }
}

Esta técnica permite o mapeamento de URLs específicas para o filtro, mas não oferece suporte nativo para definir a ordem de execução entre múltiplos filtros.

Abordagem 3: Configuração via JavaConfig (FilterRegistrationBean)

A forma mais flexível e robusta é registrar o filtro explicitamente através de uma classe de configuração, utilizando o FilterRegistrationBean.

@Configuration
public class WebFilterConfiguration {
    
    @Bean
    public FilterRegistrationBean<RequestInterceptorFilter> requestInterceptorRegistration() {
        FilterRegistrationBean<RequestInterceptorFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new RequestInterceptorFilter());
        registration.addUrlPatterns("/public/*");
        registration.setOrder(1);
        return registration;
    }

    @Bean
    public FilterRegistrationBean<ApiSecurityFilter> apiSecurityRegistration() {
        FilterRegistrationBean<ApiSecurityFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new ApiSecurityFilter());
        registration.addUrlPatterns("/*");
        registration.setOrder(2);
        return registration;
    }
}

Esta abordagem centraliza a configuração, permitindo definir tanto a ordem de execução quanto os padrões de URL de maneira altamante customizável.

  1. Comparativo das Abordagens

Abordagem de Registro Suporta Ordenação Suporta Filtro por URL
@Component + @Order Sim Não
@WebFilter + @ServletComponentScan Não Sim
JavaConfig (FilterRegistrationBean) Sim Sim

Tags: spring-boot java-ee servlet-filter spring-ioc web-development

Publicado em 6-13 00:27 por Thomas