繁体   English   中英

带有CORS的Spring Boot HTTPS,Angular 5将所有请求加倍

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM