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 doSegundoFiltro
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
- Inicie a aplicação e acesse
http://localhost:8080/qualquer-rota
. - No console, você verá mensagens de log do filtro.
- 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.
Por que os filtros são essenciais para segurança e performance em aplicações Java Web?
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