Você pode encontrar a seguinte mensagem de erro:
foi bloqueado pela política CORS: nenhum cabeçalho 'Access-Control-Allow-Origin' está presente no recurso solicitado
Este erro indica que uma solicitação para um determinado endereço foi bloqueada pelo protocolo CORS porque o cabeçalho Access-Control-Allow-Origin está faltando no recurso.
A causa raiz dos problemas de origem cruzada é que os navegadores, por motivos de segurança, restringem o acesso a recursos fora do site atual.
Por exemplo, considere um site hospedado em http://127.0.0.1:8080/ com uma determinada página. Se você acessar recursos do mesmo site, não haverá restrições. Mas se você tentar acessar recursos de um site diferente (por exemplo, http://127.0.0.1:8081), o navegador bloqueará a solicitação.
Observação: consideramos protocolo, domínio e porta como parte da definição de uma "mesma origem".
Elementos com um atributo src, como tags img e script, não estão sujeitos a esta restrição.
Historicamente, quando o front-end e o back-end não eram separados, páginas e interfaces de solicitação existiam no mesmo domínio e porta. Os navegadores permitiriam então solicitações de uma página hospedada em um domínio para solicitar recursos do mesmo domínio.
Por exemplo, http://127.0.0.1:8080/index.html pode solicitar livremente http://127.0.0.1:8080/a/b/c/userLit.
Hoje em dia, com o front-end e o back-end separados em aplicativos diferentes, isso não é permitido e causará problemas de CORS.
A origem (ou fonte) consiste no protocolo, domínio e número da porta.
Uma URL é composta de protocolo, domínio, porta e caminho. Dois URLs são considerados de "mesma origem" se seu protocolo, domínio e porta forem idênticos. Qualquer diferença em qualquer um desses três elementos constitui uma solicitação de origem cruzada.
Considere comparações entre origens para https://www.baidu.com/index.html:
URL | Origem cruzada | Razão |
---|---|---|
https://www.baidu.com/more/index.html | Não | Mesmo protocolo, domínio e porta |
https://map.baidu.com/ | Sim | Domínio diferente |
http://www.baidu.com/index.html | Sim | Protocolo diferente |
https://www.baidu.com:81/index.html | Sim | Porta diferente |
A Política de Mesma Origem é um recurso fundamental de segurança do navegador. Sem ele, a funcionalidade normal dos navegadores pode estar em risco. A arquitetura da Web depende fortemente desta política, e os navegadores a implementam para garantir a segurança.
A Política de Mesma Origem inclui:
Em um projeto onde o front-end e o back-end são implantados separadamente, abordar o CORS é crucial. Os cookies são usados para armazenar informações de login do usuário e os interceptadores Spring gerenciam as permissões. Surgem problemas quando o interceptor e o CORS são processados na ordem errada, causando um erro de CORS.
Uma solicitação HTTP primeiro passa pelo filtro antes de chegar ao servlet e depois ao interceptor. Para garantir que o processamento do CORS ocorra antes da interceptação da autorização, podemos colocar a configuração do CORS em um filtro.
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(true); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } }
Embora JSONP possa resolver problemas de origem cruzada no front-end, ele suporta apenas solicitações GET, o que é limitante em aplicativos RESTful. Em vez disso, você pode lidar com solicitações de origem cruzada com o Cross-Origin Resource Sharing (CORS) no back-end. Esta solução não é exclusiva do Spring Boot e tem sido usada em estruturas SSM tradicionais. Você o configura implementando a interface WebMvcConfigurer e substituindo o método addCorsMappings.
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } }
Você pode habilitar o CORS para métodos de controlador específicos adicionando a anotação @CrossOrigin à anotação @RequestMapping. Por padrão, @CrossOrigin permite todas as origens e métodos HTTP especificados em @RequestMapping.
@RestController @RequestMapping("/account") public class AccountController { @CrossOrigin @GetMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @DeleteMapping("/{id}") public void remove(@PathVariable Long id) { // ... } }
Compreendendo os parâmetros @CrossOrigin:
Exemplo:
@CrossOrigin @RestController public class PersonController { @RequestMapping(method = RequestMethod.GET) public String add() { // some code } }
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3