我一直在网上寻找有关CORS,我想确认,如果我做的是什么,它实际上是什么。
下面提到的是完全虚构的场景。
以一个普通网站为例。假设我的html页面有一个表单,该表单带有一个文本字段名称。在提交时,它将表单数据发送到myPage.php
。现在,服务器内部发生的事情是,将请求连同文本字段沿着发送到www.mydomain.com/mydirectory/myPage.php
。现在,服务器发现请求是从同一个域/端口/协议发出的
(***问题1。服务器如何知道所有这些详细信息。它从哪里提取所有这些详细信息?***)
尽管如此,由于请求来自同一个域,它服务于php脚本并返回所需的任何内容。
现在,为了便于讨论,假设我不想手动填充文本字段中的数据,而是想通过编程来完成。(即textField的值)。现在由于我的请求本身不是来自任何域,服务器忽略了我请求的服务。2我得到了跨域错误?
同样,我也可以编写一个Java程序,它利用HTTPClient/Post请求来做同样的事情。
***问题2:这就是问题所在吗?
现在,CORS提供给我们的是,服务器会说“任何人都可以访问myPage.php”。
对于简单的CORS请求,服务器只需将以下标头添加到其响应中:访问控制-允许-来源:*
现在,客户端到底要用这个头做什么。就像,客户端无论如何都要调用服务器上的资源,对吗?它应该由服务器来配置自己是否要接受,并相应地采取行动。
问题3:将头发送回客户端(已经向服务器发出请求的客户端)有什么用?
最后,我不明白的是,假设我正在为我的android应用程序构建一些RESTful服务。现在,假设我有一个POST服务www.mydomain.com/rest/services/myPost
。我的Tomcat服务器在我的本地计算机上托管这些服务。
在我的android应用程序中,我只需要调用这个服务,并得到返回的结果(如果有的话)。在这个例子中,我到底在哪里使用了CORS。这是否属于另一个服务器调用类别?如果是,那么具体是如何使用的。
此外,我检查了Enable Cors for Tomcat,它说我可以在我的动态Web项目的web.xml中添加一个过滤器,然后它将开始接受它。
问题4:这就是我的Android设备与Web服务之间的通话功能吗?
谢谢
4条答案
按热度按时间wgx48brx1#
1.首先,跨域检查是由浏览器执行的,而不是由服务器执行的。当JavaScript向其源服务器以外的服务器发出
XmlHttpRequest
时,如果浏览器支持CORS,它将初始化一个CORS进程。否则,请求将导致错误(除非用户故意降低浏览器安全性)1.当服务器遇到
Origin
HTTP头时,服务器将判断它是否在允许的域列表中。如果它不在列表中,请求将失败(即服务器将发送错误响应)。对于第三和第四点,我认为你应该分别问,否则这个问题会变得太宽泛,而且我认为如果你不把它去掉,它很快就会接近。
有关CORS的说明,请参阅程序员的回答:https://softwareengineering.stackexchange.com/a/253043/139479
注意:CORS只是一种约定。它并不保证安全性。您可以编写一个恶意浏览器,无视相同的域策略。它将执行从任何站点获取的JavaScript。您还可以创建带有任意
Origin
头的HTTP头,并从任何实现CORS的第三方服务器获取信息。CORS仅在您信任您的浏览器时才能工作。agyaoht72#
对于问题3,你需要了解两个站点和客户端浏览器之间的关系,正如Krumia在他们的回答中提到的,这更多的是请求中三个参与者之间的约定。
我最近介绍了posted an article,其中详细介绍了CORS握手的设计原理。
xkrw2x1b3#
我不是安全Maven,但我希望,我可以用一句话回答这个问题。
如果启用了CORS,则服务器将仅询问浏览器您是否正在从[ www.example.com ]调用请求xyz.com?如果浏览器回答是,则将显示结果,如果浏览器回答否abc.com则将抛出错误。
所以CORS依赖于浏览器,这就是为什么浏览器在实际请求之前发送预检请求。
vltsax254#
在我的例子中,我只是添加了
到我的WebSecurityConfiguration文件的问题已解决