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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- Use um Filter para:
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.