Filters e Interceptors no Spring Boot: Diferenças e Aplicações

Ao trabalhar com Spring Boot, é comum precisar modificar ou processar requisições e respostas HTTP. Dois recursos amplamente usados para isso são os Filters e os Interceptors. Apesar de aparentarem ser semelhantes, possuem propósitos distintos e operam em momentos diferentes do ciclo de requisição.

1. O que é um Filter?

Um Filter faz parte da API Servlet e atua em um nível mais baixo, processando todas as requisições antes de chegarem ao dispatcher do Spring.

Quando usar um Filter?
Use Filters para alterações gerais em requisições/respostas que se aplicam a todas as requisições HTTP, como:

  • Log de Requisições: Registrar detalhes para depuração ou monitoramento.
  • Compressão GZIP: Reduzir o tamanho da resposta para otimizar a transferência de dados.
  • Codificação de Caracteres: Garantir a consistência de codificação (ex.: UTF-8).
  • Verificações de Segurança: Implementar controles como firewall, limite de requisições e autenticação básica.
  • Modificação de Requisições/Respostas: Ajustar dados HTTP, como sanitização ou cache.

Exemplo de implementação de Filter

@Component
public class LoggingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
        System.out.println("Requisição recebida: " + request.getRemoteAddr());
        chain.doFilter(request, response);
        System.out.println("Resposta enviada.");
    }
}

  • Atua em todas as requisições, incluindo arquivos estáticos.
  • Não acessa diretamente beans ou controladores do Spring.

2. O que é um Interceptor?

Um Interceptor faz parte do Spring MVC e funciona dentro do framework Spring. Ele permite modificar requisições e respostas exclusivamente para controladores.

Quando usar um Interceptor?
Utilize Interceptors quando for necessário lidar com lógica específica do Spring, como:

  • Autenticação e Autorização: Validar credenciais de usuários antes de acessar controladores.
  • Log de Tempo de Execução: Monitorar quanto tempo um controlador leva para processar uma requisição.
  • Modificação de Model/View: Ajustar dados do modelo ou da visualização antes da resposta.
  • Inclusão de Atributos Comuns: Adicionar informações compartilhadas (ex.: dados do usuário) em todas as respostas.

Exemplo de implementação de Interceptor

@Component
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("Verificando autenticação...");
        return true; // Continua para o controlador
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("Controlador executado.");
    }
}

  • Funciona apenas com controladores Spring MVC (não inclui arquivos estáticos).
  • Pode acessar beans Spring gerenciados (usando @Autowired).

3. Diferenças principais entre Filter e Interceptor

  1. Ponto de Execução
    • Filters: Executam antes de as requisições chegarem ao DispatcherServlet, afetando todo o tráfego HTTP.
    • Interceptors: Executam antes e após métodos dos controladores, atuando somente no contexto do Spring MVC.
  2. Escopo
    • Filters: Operam no nível da API Servlet, aplicando-se a todas as requisições (incluindo recursos estáticos).
    • Interceptors: Atuam apenas em requisições específicas de controladores Spring.
  3. Acesso a Beans do Spring
    • Filters: Não acessam beans Spring diretamente, pois estão fora do contexto do framework.
    • Interceptors: Podem injetar e usar beans Spring, pois operam dentro do contexto do framework.
  4. Tipo de Requisição
    • Filters: Aplicam-se a todas as requisições HTTP (APIs, arquivos estáticos, etc.).
    • Interceptors: Aplicam-se apenas a controladores Spring MVC.
  5. Modificação de Requisições/Respostas
    • Filters: Podem alterar detalhes de requisições e respostas HTTP (como cabeçalhos e codificações).
    • Interceptors: Não modificam diretamente a requisição ou resposta, mas podem ajustar o modelo ou a visualização.
  6. Casos de Uso Comuns
    • Use um Filter para:
      • Aplicar verificações de segurança (firewall, controle de taxa).
      • Modificar requisições ou respostas HTTP brutas (log, compressão, codificação).
      • Monitorar todo o tráfego, incluindo arquivos estáticos.
    • Use um Interceptor para:
      • Autenticar ou autorizar usuários antes de acessar controladores.
      • Registrar o tempo de execução de métodos dos controladores.
      • Alterar dados no modelo ou na visualização antes da resposta.

4. Quando escolher um Filter ou Interceptor?

  • Escolha um Filter se:
    • Você precisa modificar todas as requisições, incluindo arquivos estáticos.
    • É necessário trabalhar em um nível HTTP mais básico.
    • Não precisa acessar beans Spring.
  • Escolha um Interceptor se:
    • Deseja controlar requisições destinadas a controladores.
    • Precisa modificar modelos ou visões no Spring.
    • Precisa acessar serviços Spring gerenciados.

Resumo Rápido

  • Filters: Funcionam no nível Servlet e modificam todas as requisições (incluindo recursos estáticos).
  • Interceptors: Operam no nível Spring MVC, focando em lógica específica de controladores.

Dica prática:

  • Se você precisa alterar requisições HTTP em nível bruto (cabeçalhos, codificação), use um Filter.
  • Para adicionar lógica antes ou depois de um controlador executar, use um Interceptor.

Deixe um comentário