CORS标题'Access-Control-Allow-Origin'仅在浏览器/ jquery中丢失,但在curl中正常

时间:2015-12-23 01:44:43

标签: javascript jquery tomcat curl cors

问题是我在Browser vs Curl命令

中获得了不同的标题响应

我的本​​地主机上的端口8081上有nginx提供的mypage.com(客户端html / css / js)。

我从http://mypage.com:8081上的浏览器访问它(mypage.com映射到/ etc / hosts上的> 127.0.0.1)。

页面加载正常,它会执行第一个jQuery请求。

GET http://mypage.com:8081/api/foo

我已经让Tomcat 8在端口运行我的2个REST API:9090

目标是:8081请求在nginx中得到解决

location /services
         proxy_pass         http://127.0.0.1:9090/services/
location /api
         proxy_pass         http://127.0.0.1:9090/api/

** =======到目前为止一切都很好。========== **

JQuery中的第二个请求是

GET http://mypage.com:9090/services/foo

由于浏览器中的当前页面是mypage.com:8081,而JQuery调用的目标是mypage.com:9090/services/foo;浏览器检测到CORS请求。

在请求中,“来源:http://mypage.com:8081”标题已设置,但未返回Access-Control-Allow-Origin。它根本没有。

OPTIONS http://mypage.com:9090/ returns 403 **ONLY in the browser**

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://mypage.com:9090/service/bar (Reason: CORS header 'Access-Control-Allow-Origin' missing).

我已经检查了Tomcat的配置,添加了CORS过滤器,我可以通过CURL确认当我执行浏览器执行的相同命令时一切正常。

我正在用这个圈子跑。 - 在两种情况下都设置CORS Origin标头 - 在浏览器中,结果为403,响应标题不显示

以外的任何内容
Content-Length: 87
Content-Type: text/plain;charset=ISO-8859-1
Date: Wed, 23 Dec 2015 01:11:53 GMT
Server: Apache-Coyote/1.1
  • 在curl命令中,同一请求会产生一个响应,其中Access-Control-Allow-Origin设置为在请求标头上传递的原点。

问题:为什么浏览器OPTIONS不返回Access-Control-Allow-Origin?我似乎无法通过使用具有相同参数的相同动词但通过CURL命令

命中相同的URL来重现它

1 个答案:

答案 0 :(得分:0)

我最后发现了这个问题。

根据Tomcat的CORS流程图,我将问题缩小到我从客户端发送的报头与后端支持的报头不匹配的事实。

解决方案是通过添加我的自定义标头

来覆盖tomcat过滤器中的默认值
<init-param>
            <param-name>cors.allowed.headers</param-name>
            <param-value>....,X-My-Custom,...</param-value>
</init-param>