Ola!
O que está acontecendo no seu caso
Você já fez duas coisas certas:
- Criou um
WebMvcConfigurer com CORS liberado - Adicionou headers manualmente no
JwtFilter
Mas o erro continua porque:
o preflight (OPTIONS) está sendo interceptado pelo seu filtro JWT de forma incompleta
E mais importante:
o navegador exige CORS válido antes de aceitar qualquer resposta (inclusive erro 401)
Problema principal no seu JwtFilter
Esse trecho aqui:
if (request.getMethod().equalsIgnoreCase("OPTIONS")) {
response.setStatus(HttpServletResponse.SC_OK);
return;
}
Ele até responde o OPTIONS, mas falta um detalhe importante:
você não está garantindo que os headers de CORS estão corretos para o domínio real do frontend
Você está usando:
response.setHeader("Access-Control-Allow-Origin", "*");
Isso pode quebrar quando:
- há
Authorization no request (como no seu caso) - ou quando o navegador faz validação mais rígida
Correção direta (o que ajustar)
1. Troque "*" pelo seu frontend
No JwtFilter:
private void configurarHeadersCors(HttpServletResponse response) {
response.setHeader("Access-Control-Allow-Origin", "http://localhost:5173");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
response.setHeader("Access-Control-Max-Age", "3600");
}
2. Ajuste o OPTIONS para garantir headers + retorno limpo
if (request.getMethod().equalsIgnoreCase("OPTIONS")) {
configurarHeadersCors(response);
response.setStatus(HttpServletResponse.SC_OK);
return;
}
3. Garanta que TODAS as respostas tenham CORS (inclusive erro)
Hoje você já chama configurarHeadersCors(response); no início — isso está correto e é essencial.
Sobre o erro 401 que aparece
Esse trecho do seu código:
if (header == null || !header.startsWith("Bearer ")) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.getWriter().write("Token ausente ou formato invalido");
return;
}
Aqui está o segundo problema:
- Seu frontend está fazendo requisição (GET/POST)
- Mas não está enviando o token
Por isso:
- salva no banco (provavelmente rota liberada)
- depois falha no GET (rota protegida)
O que você precisa verificar no frontend
No Axios, você precisa enviar o token:
axios.get(url, {
headers: {
Authorization: `Bearer ${token}`
}
})
Se não fizer isso, o 401 vai continuar mesmo com CORS correto.
Um detalhe importante da sua arquitetura
Você está usando:
FilterRegistrationBean (filtro manual)- sem
Spring Security padrão
Isso funciona, mas significa que:
- você mesmo é responsável por tudo (CORS + auth + fluxo)
- qualquer detalhe fora do lugar quebra fácil
Resumo direto
O problema é uma combinação de:
- CORS com
"*" + Authorization → bloqueio do navegador - Preflight (OPTIONS) não totalmente compatível
- Requisições sem token → 401
Ajuste mínimo para funcionar
- Trocar
"*" por "http://localhost:5173" - Garantir headers no OPTIONS
- Enviar token no frontend
Se depois disso ainda der erro, o próximo passo é olhar a requisição do frontend (headers completos), porque aí provavelmente é só detalhe de envio do token.