了解CORS

时间:2014-09-15 09:49:41

标签: web-services cors

我一直在网上看CORS,我想确认一下我做的是什么,实际上是什么。

下面提到的是一个完全虚构的场景。

我将举一个普通网站的例子。假设我的html页面有一个带有文本字段名称的表单。在提交时,它会将表单数据发送到myPage.php。现在,内部发生的是,服务器将请求与文本字段一起发送到www.mydomain.com/mydirectory/myPage.php。现在,服务器看到请求是从同一域/端口/协议

发出的

问题1.服务器如何了解所有这些细节。它从哪里提取所有这些细节?

尽管如此,由于请求来自同一个域,因此它会为php脚本提供服务并返回所需的任何内容。

现在,为了争论,让我们说我不想手动填写文本字段中的数据,而是我想以编程方式进行。我所做的是,我使用javascript创建一个html页面并触发POST请求以及参数(即textField的值)。现在,由于我的请求不是来自任何域,服务器忽略了我的请求服务。我得到跨域错误?

同样,我也可以编写一个Java程序,它使用HTTPClient / Post请求并执行相同的操作。

问题2:这是问题所在吗?

现在,CORS为我们提供的是,服务器会说'任何人都可以访问myPage.php'。 来自enable cors.org它说

  

对于简单的CORS请求,服务器只需要在其响应中添加以下标头:   Access-Control-Allow-Origin:*

现在,客户端究竟对这个标题做了什么。就像在,客户端无论如何想要调用服务器上的资源吧?应该是服务器来配置自己是否要接受,并采取相应的行动。

问题3:将标头发送回客户端(已向服务器发出请求的人)有什么用?

最后,我没有得到的是,我说我正在为我的Android应用程序构建一些RESTful服务。现在,假设我有一个POST服务www.mydomain.com/rest/services/myPost。我的Tomcat服务器在我的本地计算机上托管了这些服务。

在我的Android应用程序中,我只是调用此服务,然后返回结果(如果有的话)。在这种情况下,我到底在哪里使用CORS。这属于不同类别的服务器调用吗?如果是,那究竟是多少。

此外,我检查了Enable Cors for Tomcat,它说我可以在我的动态网络项目的web.xml中添加一个过滤器,然后它就会开始接受它。

问题4:这是启用从我的Android设备到我的网络服务的调用吗?

由于

2 个答案:

答案 0 :(得分:9)

  1. 首先, 跨域检查由浏览器 执行,而不是服务器。当JavaScript将XmlHttpRequest发送到服务器而不是其来源时,如果浏览器支持CORS,它将初始化CORS进程。否则,该请求将导致错误(除非用户故意降低浏览器安全性)

  2. 当服务器遇到Origin HTTP标头时,服务器将决定它是否在允许的域列表中。如果它不在列表中,则请求将失败(即服务器将发送错误响应)。

  3. 对于3号和4号,我认为你应该提出不同的问题。否则这个问题会变得太宽泛。而且我认为如果你不删除它会很快接近它。

    有关CORS的解释,请参阅程序员的回答:https://softwareengineering.stackexchange.com/a/253043/139479

    注意:CORS更像是一种惯例。它不保证安全。您可以编写一个忽略相同域策略的恶意浏览器。它将执行从任何站点获取的JavaScript。您还可以使用任意Origin标头创建HTTP标头,并从实现CORS的任何第三方服务器获取信息。 CORS仅在您信任浏览器时才有效。

答案 1 :(得分:1)

对于问题3,您需要了解两个站点和客户端浏览器之间的关系。正如Krumia在答案中提到的那样,它更像是请求中三个参与者之间的约定。

我最近posted an article详细介绍了CORS握手是如何设计的。