2014-10-29 105 views
2

使用AngularJS调用RESTFUL API。AngularJS在CORS预检响应后未发送请求

在IOS上使用Chrome浏览器时,CORS预检请求(选项请求)Accept标头设置为*/*,image/webp。响应恢复正常,但实际的GET请求永远不会被发送。正如你在响应中看到的,Content-Type头文件被设置为image/webp,我怀疑这会导致AngularJS中的问题随GET请求一起前进。

我的假设是否正确?如果是这样,是否强制服务器将Content-Type设置为其他内容的解决方案?

完整请求报头:

OPTIONS http://www.example.com:8080/resourceABC HTTP/1.1 
Host: www.example.com:8080 
Connection: keep-alive 
Access-Control-Request-Headers: accept, authorization, origin 
Access-Control-Request-Method: GET 
Origin: http://www.example.com 
Accept: */*,image/webp 
Referer: http://www.example.com/ 
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 8_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/38.0.2125.67 Mobile/12B411 Safari/600.1.4 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 

完整响应头:

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
Allow: GET,OPTIONS,HEAD 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Credentials: true 
Access-Control-Allow-Methods: GET, POST, PUT, OPTIONS 
Access-Control-Allow-Headers: X-HTTP-Method-Override, Content-Type, x-requested-with, authorization, accept 
Access-Control-Max-Age: 3600 
Content-Type: image/webp 
Content-Length: 0 
Date: Wed, 29 Oct 2014 19:26:37 GMT 
+0

我有这个相同的问题,我没有修复,你有没有设法解决这个问题? – Skintkingle 2015-10-22 16:36:00

+0

那么,我不清楚错误在哪里,无论是使用Spring还是Chromium。我记录了铬缺陷429507,但没有真正遵循。我结束了解决问题服务器端,这里做这个破解:(伪代码) if(method ==“OPTIONS”&& header ==“Accept”){header.contains(“image/webp”) ){ headers.remove(“Content-Type”); headers.add(“Content-Type”,“text/plain”); } } – Marc 2015-10-23 18:58:23

回答

1

海兰。 我刚刚在这里访问AngularJS服务的另一个域上的REST服务。

检查发送到我的REST的服务的请求头,看我允许从客户端导致MIT要求下面的一切:

设置的访问控制允许报头'在一个确保它包含“Access-Control-Request-Headers”中的所有项目的方式为我解决了这个问题。

Marc我发现在你的'Access-Control-Request-Headers'中请求了标题“origin”,但是在你的“Access-Control-Allow-Headers”中却没有。

发送以下响应报头的作品在我的情况(的AppKey是头我的内部身份验证密钥):

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: * 
Access-Control-Allow-Headers: appkey,content-type 

希望这是明确的,它帮助。 最好的问候, 基督教

PS:“访问控制允许报头:*”并没有我的情况下工作

UPDATE:

允许通过后的申请表格,提交我不得不将'content-type'添加到'Access-Control-Allow-Headers'

+0

嗨基督教,感谢您的意见。我将'Origin'添加到'Access-Control-Allow-Headers',但同样的问题。 在请求中,你看到'Accept:*/*,image/webp'吗?并在你的回应中,你是否看到'Content-Type:image/webp'?我真的认为这与问题有关。 – Marc 2014-10-31 13:33:06

+0

我已经取得了一些进展。这与angularJS无关,我可以用简单的AJAX请求重现。我可以通过强制服务器仅为'OPTIONS'响应返回'Content-Type:text/plain'来解决这个问题。这是一个黑客,所以我必须明白为什么没有这个黑客它返回'Content-Type:image/webp'。无论哪种方式,都有一个错误,为什么CHROME为OPTIONS请求设置了“Accept”头值?没有意义。 Hy。Marc。 – Marc 2014-11-02 18:02:26

+0

Hy Marc。今天,我可以在iPAD上使用Chrome测试我的服务,并且它在请求中确实表示“接受:*/*,image/webp”。 我的回应总是说'Content-Type:text/plain',所以你的问题不会在这里弹出。我没有手动设置它 - 它似乎是一个默认(很老的tomcat6)。我想知道为什么当'*/*'也适用时,你的框架返回'image/webp'。 我做了一些调查,但无法根据规范找出正确的CORS预检应答内容类型。在例子中,我总是阅读“text/plain”。 – 2014-11-04 15:12:05