弹簧启动的CORS不在响应头中

Pat*_*shi 0 java spring spring-mvc

我尝试按照该春季站点的建议为我的春季启动应用程序实施GLOBAL CORS,该应用程序已部署到Pivotal Cloud Foundry。

https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/cors.html

但是,当我向服务端点发送OPTIONS消息时,响应中不返回任何CORS标头。因此,应用程序在预检后无法进行POST调用。这是我的实现。

@Configuration
@EnableWebMvc
public class CORSConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("*/**")
            .allowedOrigins("*")
            .allowedMethods("GET", "POST", "OPTIONS")
            .allowedHeaders("Content-Type", "Authorization")
            .allowCredentials(false).maxAge(3600);
    }
}
Run Code Online (Sandbox Code Playgroud)

我有什么想念的吗?

Pat*_*shi 5

好。我找到了问题所在。单独的HTTP OPTIONS请求并不构成飞行前请求。为了将OPTIONS视为飞行前请求,它还需要2个以上的请求标头。一个是Origin,我已将其添加到请求中。但是,我错过的是在访问控制请求方法上。浏览器生成的飞行前请求中将包含所有3个HTTP请求标头。添加所有3个请求标头后,我看到我的CORS标头又返回了响应。

这是示例代码和响应。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
public class CORSConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("*")
            .allowedMethods("POST")
            .allowedHeaders("Content-Type", "Authorization")
            .allowCredentials(false)
            .maxAge(32400);  // 9 hours max age
    }
}
Run Code Online (Sandbox Code Playgroud)

这是请求:

OPTIONS /my-end-point HTTP/1.1
Host: my-app.my-domain.com
Origin: http://localhost:8090
Access-Control-Request-Method: POST
Cache-Control: no-cache
Postman-Token: bc7171bc-7f84-3b44-a304-818627411a72
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Run Code Online (Sandbox Code Playgroud)

这是回应。

access-control-allow-methods ?POST
access-control-allow-origin ?*
access-control-max-age ?32400
Run Code Online (Sandbox Code Playgroud)