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.
- 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);
}
}
- 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.
- 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 |