【发布时间】:2019-07-05 18:55:24
【问题描述】:
我们在 ubuntu 服务器上运行 Spring Boot 应用程序。我们使用 Netflix Zuul 作为 API 网关,使用 Eureka 作为服务注册。并使用 Apache2 作为 DNS 的网络服务器。
当我通过 jQuery Ajax 从本地调用 API 时,出现以下异常:
Access to XMLHttpRequest at 'https://*****.com/api/users' from origin 'null' 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.
我可以在 Request Headers
下看到 "Origin: null"Ajax 代码:
$.ajax({
type: "GET",
dataType: "json",
crossDomain: true,
headers: {
'Accept':'application/json',
'Content-Type':'application/json',
'Access-Control-Allow-Origin': "*"
},
url: "https://*****.com/api/users",
success: function(data){
//alert(data);
console.log(data);
}
});
要修复 CORS,尝试了以下方法: 在 apache 中添加了所需的配置:
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header set Access-Control-Max-Age "1000"
Header set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
在 WebMvcConfigurerAdapter 实现类中添加 CorsMappings:
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*");
}
在 Zuul 代理类中添加了 CorsFilter bean(使用 @EnableZuulProxy 注释):
@Bean
public CorsFilter corsFilter() {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("HEAD");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
config.addAllowedMethod("DELETE");
config.addAllowedMethod("PATCH");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
但仍然是同样的错误。有什么想法可以解决这个问题吗? 谢谢。
【问题讨论】:
-
响应的 HTTP 状态码是什么?此外,在您的前端代码中,在您的 ajax 调用选项的“标头”部分中,删除 Access-Control-Allow-Origin 标头。 Access-Control-Allow-Origin 是响应标头,而不是请求标头。您不会通过尝试将其设置为请求标头来解决任何问题。
-
我已经尝试不使用原始标头,但它不起作用。 HTTP 响应:请求方法:OPTIONS 状态码:200 OK
标签: ajax spring spring-boot cors