我有一个Angular2服务调用Java Spring控制器,直到8月16日才能正常工作。它对资源进行PUT,POST,DELETE和GET请求。问题是PUT调用的预检请求现在回来403禁止,这个问题只出现在PUT请求上,只在chrome上(我使用的是最新版本,我相信,52.0.2173.116),并且只有在我在没有附加任何标题的情况下发出了我的PUT请求。
Angular2打字稿&删除调用如下所示:
let body = JSON.stringify({sequence_number: 1, task_id: 43});
http.put('http://localhost:8080/item/ae84k38d', body);
http.delete('http://localhost:8080/item/id38dk42');
CorsMapping in Spring中的WebMVCConfig代码:
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("GET", "PUT", "POST", "DELETE");
}
那些put / delete调用导致以下预检OPTIONS请求&根据Fiddler的回应 DELETE,PUT
有一件事需要注意,我不完全确定其重要性,是Fiddler显示Chrome标记在Access-Control-Request-Headers标头上,没有任何值,而FireFox的相同请求则忽略了此标题关于飞行前请求。
有趣的是,如果我然后将put请求更改为:
http.put('http://localhost:8080/item/ae84k38d', body, {headers: {'Content-Type': 'application-json');
并将以下内容附加到CORS映射:
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedMethods("GET", "PUT", "POST", "DELETE")
.allowedHeaders("content-type");
}
然后put请求将再次成功使用chrome,这就是为什么我说这只发生在我不在PUT调用上提供头文件的时候。
我想我的问题是,有没有人知道为什么会这样?我在春天错误地使用CorsRegistry吗?我在哪里出错了,我有点失落。