1
resposta

Problema Cors no Spring Boot

Olá, boa tarde

Estou desenvolvendo um projeto com java Spring Boot e estou enfrentando um erro de cors, quando meu front end envia um paciente para cadastro ele aparece no banco de dados cadastrado, mas na hora que o front pede o GET dos psciente ele da um erro de CORS, coloquei em anexo a foto do console do frontInsira aqui a descrição dessa imagem para ajudar na acessibilidade

Git Hub: https://github.com/PatriciaReghine/Nutri-Back

1 resposta

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:

  • 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:

  1. CORS com "*" + Authorization → bloqueio do navegador
  2. Preflight (OPTIONS) não totalmente compatível
  3. 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.