Erro de CORS em Spring + React?
Estou tento problemas com CORS. possuo uma api que requer um token, ao enviar no header pelo axios recebo o erro. api e o app web estão rodando em localhost. Já tentei enviando o rogin pelo cliente. Pertindo todas as origens e a anotação @CrossOrigin. Alguem já passou por isso?
segue o erro: origin has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
---Resolvido------------------------------------------------------------------------ apos a dica do leandrodaher, resolvi testar no firefox e vi um erro diferente: falta cabeçalho 'Access-Control-Allow-Origin' E pesquisando encontrei essa discução: https://pt.stackoverflow.com/questions/422227/has-been-blocked-by-cors-policy-no-access-control-allow-origin
A solução que funcionou foi implementar o CorsFilter, um filter semelhante ao do JSF. em Access-Control-Allow-Origin espefifiquei o localhost:3000, e adicionei meus heders tambem. Segue o exemplo de implementação.
import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component;
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;
/**
- @author emanuel
*/ @Component @Order(Ordered.HIGHEST_PRECEDENCE) public class CorsFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse response = (HttpServletResponse) res;
HttpServletRequest request = (HttpServletRequest) req;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods",
"ACL, CANCELUPLOAD, CHECKIN, CHECKOUT, COPY, DELETE, GET, HEAD, LOCK, MKCALENDAR, MKCOL, MOVE, OPTIONS, POST, PROPFIND, PROPPATCH, PUT, REPORT, SEARCH, UNCHECKOUT, UNLOCK, UPDATE, VERSION-CONTROL");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept, Key, Authorization");
if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
response.setStatus(HttpServletResponse.SC_OK);
} else {
chain.doFilter(req, res);
}
}
public void init(FilterConfig filterConfig) {
// not needed
}
public void destroy() {
// not needed
}
}
Já tive problemas com o cors anteriormente, solucionei me baseando nessa dúvida https://pt.stackoverflow.com/questions/399323/cors-n%C3%A3o-sendo-aplicados-spring-boot Creio que possa lhe ajudar
Recentemente eu tive um problema parecido. Primeiro faça como o leopoglia disse, coloque o Access-Control-Allow-Origin no cabeçalho de resposta do servidor.
Depois teste com o Firefox pois o Chrome parece bloquear requisições para a rede interna. Observe que no Firefox você precisa especificar exatamente o host e porta do cliente que está fazendo requisição para o servidor. Não poderá usar o valor coringa asterisco (*).
Esta pergunta no Stackoverflow explica esse comportamento do Chrome https://stackoverflow.com/questions/66534759/cors-error-on-request-to-localhost-dev-server-from-remote-site
Pode ser a falta de configuração do cors no Spring, se você não tiver, você deve criar no root do spring uma classe chamada CorsConfiguration.
@Configuration
public class CorsConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD", "TRACE", "CONNECT");
}
}