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)
我有什么想念的吗?
好。我找到了问题所在。单独的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)
| 归档时间: |
|
| 查看次数: |
2174 次 |
| 最近记录: |