为什么我的PUT请求仅在没有标头和Chrome时发送时才会失败CORS

时间:2016-08-17 16:29:57

标签: javascript spring google-chrome spring-mvc angular

我有一个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的回应 DELETEPUT

有一件事需要注意,我不完全确定其重要性,是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吗?我在哪里出错了,我有点失落。

0 个答案:

没有答案