Como configurar filtros (Filters) em uma aplicação Java Web?

Os filtros em uma aplicação Java Web permitem interceptar requisições e respostas HTTP, sendo usados para segurança, autenticação e monitoramento.

Como configurar filtros (Filters) em uma aplicação Java Web?

Os Filters em aplicações Java Web são usados para interceptar requisições e respostas HTTP, permitindo manipulação antes que cheguem ao Controller ou após o processamento. Eles são úteis para segurança, autenticação, logging e compressão de dados.

1. Criando um Filtro Simples no Spring Boot

No Spring Boot, podemos criar um filtro implementando a interface Filter:

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import java.io.IOException;

@Component
public class MeuFiltro implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        System.out.println("Requisição para: " + req.getRequestURI());
        chain.doFilter(request, response);
        System.out.println("Resposta enviada com status: " + res.getStatus());
    }
}

Explicação:

  • O método doFilter() intercepta todas as requisições.
  • chain.doFilter(request, response) permite que a requisição continue o fluxo normal.
  • O filtro registra logs da URI da requisição e do status da resposta.

2. Definindo a Ordem de Execução do Filtro

Podemos definir a ordem de execução dos filtros usando a anotação @Order:

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(1)
public class PrimeiroFiltro implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Executando Primeiro Filtro");
        chain.doFilter(request, response);
    }
}
@Component
@Order(2)
public class SegundoFiltro implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("Executando Segundo Filtro");
        chain.doFilter(request, response);
    }
}

Explicação:

  • O PrimeiroFiltro será executado antes do SegundoFiltro devido à ordem definida.
  • @Order(1) indica que esse filtro será processado primeiro.

3. Criando um Filtro de Autenticação Personalizado

Os filtros podem ser usados para autenticação, como verificar se um Token JWT está presente:

@Component
public class JwtAuthFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        String token = req.getHeader("Authorization");

        if (token == null || !token.startsWith("Bearer ")) {
            HttpServletResponse res = (HttpServletResponse) response;
            res.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Token inválido ou ausente");
            return;
        }

        chain.doFilter(request, response);
    }
}

Explicação:

  • O filtro verifica se o Token JWT está presente no cabeçalho Authorization.
  • Se o token estiver ausente, a requisição é bloqueada com status 401.
  • Caso contrário, a requisição segue normalmente.

4. Registrando um Filtro de Forma Programática

Também é possível registrar filtros manualmente usando FilterRegistrationBean:

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FiltroConfig {
    @Bean
    public FilterRegistrationBean<MeuFiltro> registrarFiltro() {
        FilterRegistrationBean<MeuFiltro> registro = new FilterRegistrationBean<>();
        registro.setFilter(new MeuFiltro());
        registro.addUrlPatterns("/api/*");
        registro.setOrder(1);
        return registro;
    }
}

Explicação:

  • setFilter(new MeuFiltro()) registra um filtro customizado.
  • addUrlPatterns("/api/*") define que o filtro só será aplicado a URLs específicas.
  • setOrder(1) determina a prioridade do filtro.

5. Diferença entre Filtros e Interceptadores

Característica Filtros (Filter) Interceptadores (HandlerInterceptor)
Executado em Servlet Spring MVC
Atua em Requisições e respostas Apenas nas requisições
Acessa o corpo da resposta? Sim Não
Ideal para Segurança, logging, CORS Autorização e validação de requisição

6. Testando um Filtro no Spring Boot

  1. Inicie a aplicação e acesse http://localhost:8080/qualquer-rota.
  2. No console, você verá mensagens de log do filtro.
  3. Caso o filtro bloqueie a requisição (como no caso do JWT), o navegador retornará um erro 401 Unauthorized.

Conclusão

Os filtros no Spring Boot permitem manipular requisições e respostas de forma eficiente. Eles são usados para autenticação, segurança, compressão de dados e logs. Saber configurar e aplicar filtros corretamente é essencial para desenvolver APIs e aplicações web seguras e performáticas.

Os filtros em Java Web são um dos pilares da segurança e monitoramento de APIs REST. Eles permitem interceptar requisições HTTP, validar tokens de autenticação e até modificar cabeçalhos antes que os dados cheguem ao controlador. Muitas empresas usam filtros para implementar CORS, compressão de resposta e até mesmo firewalls de aplicação. Com a configuração correta, os filtros podem melhorar significativamente a segurança e a performance do sistema.

Algumas aplicações:

  • Autenticação e segurança com tokens JWT
  • Registro de logs e auditoria de requisições
  • Implementação de CORS (Cross-Origin Resource Sharing)
  • Compressão de respostas para otimizar performance

Dicas para quem está começando

  • Use @Component para registrar filtros automaticamente
  • Utilize FilterRegistrationBean para filtros personalizados
  • Defina corretamente a ordem dos filtros com @Order(n)
  • Combine filtros com interceptadores para controle avançado

Contribuições de Rodrigo Farias

Compartilhe este tutorial: Como configurar filtros (Filters) em uma aplicação Java Web

Compartilhe este tutorial

Continue aprendendo:

O que são interceptadores (Interceptors) no Spring

Interceptadores no Spring permitem a manipulação de requisições e respostas HTTP antes e depois da execução de um Controller.

Tutorial anterior

Como fazer paginação de resultados no Spring Boot

A paginação no Spring Boot permite otimizar consultas ao banco de dados, retornando dados de forma segmentada com Spring Data JPA e Pageable.

Próximo tutorial