[英]Spring Boot HTTPS with CORS, Angular 5 double all requests
一个适用于我的小型Angular 5
网站的Spring boot(v5) with embeded tomcat
REST API的Spring boot(v5) with embeded tomcat
,并且该REST API基于https
协议,因此我需要启用cors origin
以使我的网站与REST API通信。 我该怎么做:
@SpringBootApplication
public class AdminPanelApplication {
public static void main(String[] args) {
SpringApplication.run(AdminPanelApplication.class, args);
}
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowCredentials(true)
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*");
}
};
}
}
但是由于这个cors origin
,我的网站开始对所有请求发送2个请求,第一个是OPTION请求,第二个是真实请求(get,post等)。
我认为这是坏事,至少对于负载的服务器(而不是发送一个请求,我总是发送两个(甚至寿第一重量很轻option
要求),我没有看到任何网站上这种行为(示例stackoverflow :))
例:
因此,我假设我做错了什么,那么如何以正确的方式设置cors的原点(或其他方法)?
这是正常现象,不是您的代码,而是浏览器。
第一个PREFLIGHT
请求作为OPTIONS发送,以仅检查标头,并避免将第一个请求作为GET或POST发送的副作用。
CORS的主要目的是使用响应标头为浏览器带来安全性。 假设您正在将数据发送到某个跨域服务器,并且服务器没有适当的标头,但是由于您的请求是GET或POST,因此有效请求将使服务器正常处理请求,而浏览器将由于缺少标头而显示CORS错误。
为了保护这种情况,在发出原始请求之前,会发出预检请求作为选项,以检查服务器发送的响应头。 如果服务器未发送正确的标头,则浏览器将不会发出原始请求。
您没有做错任何事。 第一个OPTION请求是浏览器自动发出的预检请求 。 它检查服务器是否实际上允许来自来源,方法等的请求。您可以设置最大期限CorsConfiguration.setMaxAge ,该值告诉浏览器在一定时间内缓存Preflight响应。
第一个请求是OPTIONS类型,这很正常。 HTTP OPTIONS方法用于描述目标资源的通信选项。
在此处了解更多信息: https : //developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
我认为您没有做错任何事情,这很正常。 如果要发送除自动发送的标头之外的任何自定义标头,浏览器会首先发出OPTION请求,以确保安全。
预检请求首先通过OPTIONS方法将HTTP请求发送到另一个域上的资源,以确定实际请求是否可以安全发送。 跨站点请求这样被预检,因为它们可能会影响用户数据。
有关CORS的详细信息,请参见此处 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.