我对此非常困惑。几年前,当我开始进行Web开发时,我记得遇到SOP阻止了我的请求。
然而在此之后的某个地方,我忘记了它并且多年来没有碰到它。我知道它仍然存在,但我可以$.ajax
或任何其他此类变体,而请求失败。我公司的网页通过多个框架向第三方服务提出了数十个请求,没有任何问题。
这笔交易是什么?只是现代的Web框架和库知道如何解决它,并为我照顾它?也许是因为我几年没有用手写出XMLHttpRequest
我不再遇到它了? XMLHttpRequest
是否有一些选项,例如origin
,可以解决这个问题?
答案 0 :(得分:0)
基本规则
同源策略适用于从页面到与GET呼叫以外的网页域(包括子域)不同的域的任何HTTP调用。
这意味着如果您向页面添加脚本标记,加载图像或执行使用GET方法的任何类型的HTTP调用 - 那么您就没有问题。 另一方面,如果您尝试使用其他方法(如POST,PUT,DELETE等)到另一个域,则浏览器将阻止该调用并抛出错误。
围绕此
的方式但是,有几种方法可以解决这个问题。
第一种是使用GET调用,但让另一方将该调用解释为其他内容。 一个很好的例子就是一种名为JSONP的技术,我们在这里向页面添加一个脚本标记(这是一个GET调用),响应GET调用的服务器并不只返回一个常规的JS脚本,但是相反,它会返回一个特别定制的"响应,它引用原始页面上的代码告诉它它有一个合适的响应。
实现此目的有几种模式,最常见的是构建到jQuery中的一种模式,即GET调用添加带有函数名称的查询参数,返回的脚本在全局范围内调用该函数。 jQuery听了那个调用并做出相应的响应。 要了解详情,请转到此答案:Confused on how a JSONP request works
外卡
围绕这个问题的新方法,比JSONp更清晰的解决方案是CORS,这是浏览器和Web服务器之间的一种契约。 基本上浏览器将做什么(假设它支持CORS,旧版浏览器不支持),而不是阻止"非GET"完全呼叫,浏览器将首先对Web服务器执行OPTIONS调用。网络服务器将查看请求并确定"选项" (AKA方法)此客户端用于与之通信。显然,默认只有一个选项:GET调用,但您可以设置您的Web服务器以支持其他选项,如PUT,DELETE等。 要了解有关CORS的更多信息,请查看https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS