我一直在网上看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设备到我的网络服务的调用吗?
由于
答案 0 :(得分:9)
首先, 跨域检查由浏览器 执行,而不是服务器。当JavaScript将XmlHttpRequest
发送到服务器而不是其来源时,如果浏览器支持CORS,它将初始化CORS进程。否则,该请求将导致错误(除非用户故意降低浏览器安全性)
当服务器遇到Origin
HTTP标头时,服务器将决定它是否在允许的域列表中。如果它不在列表中,则请求将失败(即服务器将发送错误响应)。
对于3号和4号,我认为你应该提出不同的问题。否则这个问题会变得太宽泛。而且我认为如果你不删除它会很快接近它。
有关CORS的解释,请参阅程序员的回答:https://softwareengineering.stackexchange.com/a/253043/139479
注意:CORS更像是一种惯例。它不保证安全。您可以编写一个忽略相同域策略的恶意浏览器。它将执行从任何站点获取的JavaScript。您还可以使用任意Origin
标头创建HTTP标头,并从实现CORS的任何第三方服务器获取信息。 CORS仅在您信任浏览器时才有效。
答案 1 :(得分:1)
对于问题3,您需要了解两个站点和客户端浏览器之间的关系。正如Krumia在答案中提到的那样,它更像是请求中三个参与者之间的约定。
我最近posted an article详细介绍了CORS握手是如何设计的。