跨域资源共享(CORS)概念

2024-01-06

我对跨域 JavaScript 的概念有疑问。

有一个服务器(例如 amazon.com),只有选定的域才能使用其网络服务。 所以肯定的是,如果我尝试从本地使用他们的服务,我就不能。 我在控制台上看到了这个

跨源请求被阻止:同源策略不允许读取 远程资源位于。 这可以通过将资源移动到同一域或 启用 CORS。

PS:我也使用jquery跨域方式,但没有用。

但是,如果要使用亚马逊的网络服务,所选域中的某个域具有 JavaScript,如果我们将其包含在 html 中,它就可以工作。

<script src="http://example.com"></script>

他们有一种通过 Ajax 获取响应的方法。

我的问题是:

  1. 当我们从互联网 URL 引用 JavaScript 文件时会发生什么。我们的机器上有运行本地副本吗?
  2. 创建 httpRequest 后,将有一个请求源作为我的域或 xyz。

前面的重要说明:如果另一端的服务器没有启用它,则您在自己的服务器上无能为力客户端允许跨源ajax请求的代码。

在回答你的问题之前,先给你介绍一下背景:

同源安全策略 http://en.wikipedia.org/wiki/Same-origin_policy

简而言之,同源安全策略可确保来自一个源的脚本不能从其他源获取内容。现在为了向您解释起源的概念,让我引用部分内容同源安全策略的维基百科文章 http://en.wikipedia.org/wiki/Same-origin_policy:

下表概述了针对 URL 检查的典型结果“http://www.example.com/dir/page.html http://www.example.com/dir/page.html".

Compared URL                                             Outcome  Reason
-------------------------------------------------------  -------  ----------------------
http://www.example.com/dir/page2.html                    Success  Same protocol and host
http://www.example.com/dir2/other.html                   Success  Same protocol and host
http://username:[email protected] /cdn-cgi/l/email-protection/dir2/other.html Success  Same protocol and host
http://www.example.com:81/dir/other.html                 Failure  Same protocol and host but different port
https://www.example.com/dir/other.html                   Failure  Different protocol
http://en.example.com/dir/other.html                     Failure  Different host
http://example.com/dir/other.html                        Failure  Different host (exact match required)
http://v2.www.example.com/dir/other.html                 Failure  Different host (exact match required)
http://www.example.com:80/dir/other.html                 Depends  Port explicit. Depends on implementation in browser.

与其他浏览器不同,Internet Explorer 不将端口包含在源计算中,而是使用安全区域来代替。

因此,例如,您的 JavaScript 无法从其来源服务器以外的 Web 服务器下载任何内容(也称为向其发出 HTTP 请求)。这正是您无法向其他域发出 XmlHttpRequests(又名 AJAX)的原因。


CORS 是一种方法另一端的服务器(不是浏览器中的客户端代码)可以放宽同源政策 http://en.wikipedia.org/wiki/Same-origin_policy#Relaxing_the_same-origin_policy.

过于简单化的描述跨源资源共享 (CORS) http://en.wikipedia.org/wiki/Cross-origin_resource_sharing.

CORS 标准通过添加新的 HTTP 标头来工作,这些标头允许服务器向允许的源域提供资源。浏览器支持这些标头并尊重它们建立的限制。

Example: 假设您的网站是http://my-cool-site.com并且,您在域中有第三方 APIhttp://third-party-site.com,您可以通过 AJAX 访问。

让我们假设来自您服务器的页面my-cool-site.comthird-party-site.com。通常,用户浏览器将拒绝对除您自己的域/子域之外的任何其他站点的 AJAX 调用同源安全策略 http://en.wikipedia.org/wiki/Same_origin_policy。但如果浏览器和第三方服务器支持 CORS,则会发生以下情况:

  • 浏览器将发送和OriginHTTP 标头到third-party-site.com

    Origin: http://my-cool-site.com
    
  • 如果第三方服务器接受来自您的域的请求,它将用一个响应Access-Control-Allow-OriginHTTP 标头:

    Access-Control-Allow-Origin: http://my-cool-site.com
    
  • 要允许所有域,第三方服务器可以发送此标头:

    Access-Control-Allow-Origin: *
    
  • 如果您的网站不被允许,浏览器将抛出错误。

如果客户有相当现代的支持 CORS 的浏览器 http://caniuse.com/cors,以及您的第三方服务器支持跨域资源共享 http://client.cors-api.appspot.com/client同样,CORS 对您也很有用。

在一些过时的浏览器(例如 IE8)中,您必须使用 Microsoft 特定的XDomainRequest对象而不是XMLHttpRequest进行可以正确使用 CORS 的调用;现在这已经过时了,所有现代浏览器(包括来自 Microsoft 的浏览器)都处理 CORSXMLHttpRequest反而。但如果您需要支持过时的浏览器,这一页 http://jquery-howto.blogspot.com/2013/09/jquery-cross-domain-ajax-request.html#cors描述它:

要发出 CORS 请求,您只需使用XMLHttpRequest在 Firefox 3.5+、Safari 4+ 和 Chrome 中XDomainRequestIE8+ 中的对象。使用时XMLHttpRequest对象,如果浏览器发现您正在尝试发出跨域请求,它将无缝触发 CORS 行为。

这是一个 JavaScript 函数,可以帮助您创建跨浏览器 CORS 对象。

function createCORSRequest(method, url){
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr){
        // XHR has 'withCredentials' property only if it supports CORS
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest != "undefined"){ // if IE use XDR
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {
        xhr = null;
    }
    return xhr;
}

同样,这仅适用于过时的浏览器。


上述原因是您无法通过脚本使用 Amazon 的 Web 服务的原因。亚马逊服务器只允许将 JavaScript 文件下载到选定域提供的页面。

来回答您的numbered问题:

    • 如果文件是同源的,浏览器就会下载该文件。
    • 如果不是同源,则 CORS 请求成功后将下载该文件。
    • 否则,下载脚本会失败。
    • 如果下载成功,JavaScript 文件的内容将被加载到浏览器的内存中,并被解释和执行。
  1. 请参阅 CORS 的说明来了解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跨域资源共享(CORS)概念 的相关文章

  • jQuery 检查复选框并触发 javascript onclick 事件

    我正在尝试使用 jQuery 检查复选框并在此过程中触发 onclick 事件 假设我在 html 中定义了一个复选框
  • 改进 D3 序列旭日示例

    This D3示例作为我的出发点 http bl ocks org kerryrodden 7090426 http bl ocks org kerryrodden 7090426 我想更改提供图表的数据 并且我做了以下新示例 http j
  • 单击输入字段会触发窗口调整大小

    我有一个带有徽标 菜单和搜索的标题 当我在桌面上时 我会按该顺序显示所有元素 但如果我的窗口宽度小于 980 像素 菜单会隐藏 有一个切换按钮 并且徽标会与nav并附在徽标之后 如果宽度更大 则徽标将再次分离并附加到 DOM 中的旧位置 w
  • TRACKER:错误TRK0005:无法找到:“CL.exe”。该系统找不到指定的文件

    我尝试在 Windows 8 上的 Node js 项目中执行以下命令 npm 安装 电子邮件受保护 cdn cgi l email protection 但我收到一个错误 我不知道如何处理 TRACKER 错误TRK0005 无法找到 C
  • 使用 AJAX 或多线程加速页面加载

    我的页面有 5 个部分 每个部分大约需要 1 秒来渲染 Page Load RenderSection1 1 sec RenderSection2 1 sec RenderSection3 1 sec RenderSection4 1 se
  • 离子旋转器未显示

    我用 http 请求填充 Ionic 集合重复列表 但我不想将所有内容直接加载到 DOM 中 因此 我只显示其中一些项目 并在您向下滚动时添加其余项目 为此我实现了无限滚动功能 当我到达页面底部时 它应该显示一个旋转器 但它没有 这些物品至
  • 当我更改浏览器选项卡时,Jquery Animate 停止

    我的投资组合中有一个疯狂的问题 http hericdk com http hericdk com 我用jquery做了一个简单的动画 一个太空飞船飞行的动画 然后就出现了我的作品 这个想法不错 大家都喜欢 但问题是 由于某种奇怪的原因 当
  • 如何使用 jQuery 通过 Ajax 发送复选框数组的值?

    我有一个包含很多表单字段的表单 12 x n 行 每行中的第一个字段 代表产品 是一个类似于以下内容的复选框
  • 从网站存储数据的最简单方法(在服务器端)

    我有一个非常简单的网站 实际上是单页 有一个输入字段和一个按钮 我需要将用户提交的数据存储在服务器端的某个位置 完美的方法可能是简单的文本文件 并在每次单击按钮后附加新行 日志文件也可以 据我了解 JavaScript 本身是不可能的 我在
  • 通过 jQuery 从输入类型=“文件”多个中删除文件

    我在使用 PHP 和 jQuery 上传文件时遇到问题 表单可以一次上传多个图像 这些图像可以在滑块中预览 表单还包含两个字段标题和描述 滑块通过 jQuery 工作 当用户通过单击选择文件来选择多个图像时
  • 带时间戳的 Firestore 查询

    如果它是文本字段 我可以使用 where 条件获取数据 但是当我尝试对时间戳字段和日期执行相同操作时 事情不起作用 这是我的代码 home ts firebase firestore collection cities where time
  • (0, eval) () 的作用是什么? [复制]

    这个问题在这里已经有答案了 以下内容来自这个问题 https stackoverflow com questions 14119988 return this 0 evalthis 14120023 14120023 function q
  • 显示班级图片 10 秒

    我有下面给出的代码显示9 boxes 其值如下digital time 还有一个班级box002显示digits相当于随机选择的九个盒子的值 box002 can be dragged to digital time starting wi
  • 父指令属性更改时子指令不会更新

    这是对这两个问题的后续 在父指令和子指令之间传递参数 https stackoverflow com questions 42814530 pass argument between parent and child directives
  • Angular 2访问组件内的ng-内容

    我怎样才能访问 content 来自组件类本身的组件 我想做这样的事情
  • 如何修复nodejs Express服务器中的“MulterError:意外字段”?

    我正在设置一个服务器来从客户端上传 zip 文件 服务器运行express和multer来执行此操作 上传文件时 服务器抛出 MulterError 意外字段 错误 我无法弄清楚是什么导致了它 我尝试过使用 png 图像 效果很好 但对于
  • 向特定客户端发送消息以及消息发送用户

    我是 SignalR 的初学者 我创建了一个基于 SignalR 的基本聊天应用程序 我面临的问题是我想向特定客户端以及发送消息的用户发送消息 这个怎么做 我知道要向特定客户端发送消息 我们可以这样做 Clients Client Cont
  • 使用 JavaScript onclick 添加表格行

    我正在尝试使用 javascript 添加下面找到的完全相同的元素 我已经尝试了这里找到的所有解决方案 我什至尝试用php echo但没有运气 无需更改任何输入名称或类似内容 只需单击该按钮即可向表中添加另一行 仅此而已 这是该元素 tr
  • jquery:选择xpath或将xpath转换为css?

    我需要基于 xpath 选择 或者将 xpath 转换为 css 有插件或者内置功能吗 ex html body div a 4 each 并非所有 xpath 表达式都可以转换为类似 CSS 的选择器 或者不能有效地工作 您可以使用 eq
  • NodeJS:如何获取服务器的端口?

    您经常会看到 Node 的示例 hello world 代码 它创建一个 Http Server 开始侦听端口 然后执行以下操作 console log Server is listening on port 8000 但理想情况下你会想要

随机推荐

  • CKEditor - 使用数据处理器删除脚本标签

    我对 CKEditor 还很陌生 两天前开始使用它 而且我仍在与一些配置作斗争 例如从编辑器中删除标签 例如 如果用户在源模式下键入以下内容 我想将其删除 查看文档 我发现这可以使用 HTML 过滤器来完成 我这样定义了它 但它不起作用 v
  • 如何增加 JVM 内存? [复制]

    这个问题在这里已经有答案了 你好 我想知道我是否可以根据我的应用程序增加 JVM 内存 如果可以 我该如何增加 JVM 内存 我怎样才能知道 JVM 的大小 启动 JVM 时 可以调整两个参数以满足您的内存需求 Xms
  • 如何通过 Jayway JsonPath 展平带有嵌套列表的 json?

    目前我需要根据配置处理一些 json 结果 而不是硬代码 例如 json如下 data orderNo CG8310150 details skuId 4384 amount 2 skuId 4632 amount 5 orderNo CG
  • 如何让greatmonkey 检查页面上是否找到文本

    我确实在谷歌和用户脚本网站上做了一些研究 但没有成功找到答案 那么基本上我如何检查页面上是否找到特定文本 并且文本没有特殊标签或任何东西 对于 FF GM 来说 一个粗略但快速的方法 if Text you are looking for
  • Android随机多项选择测验:如何识别正确答案

    我正在尝试为 Android 创建一个随机多项选择测验 我想显示字符串数组中的随机问题 另一个字符串数组的相应答案显示在四个选项之一中 其他三个选项将来自另一个字符串数组 该数组将用于随机提供所有问题的 错误 答案 两个问题 有没有更好的方
  • Mono 不写入设置默认值

    这是我的问题 如果我只使用一个 Windows 窗体项目并且仅调用 Settings Default Save 运行时 Mono 会创建一个 user config 文件 其中包含每个设置的默认值 很好 到目前为止一切都很好 但现在我添加了
  • CSS 不显示任何内容且不透明动画且关键帧不起作用

    我有一个非常基本的 HTML 片段 其目的是从display none to display block不透明度从 0 变为 1 我使用的是 Chrome 浏览器 它使用 webkit前缀作为偏好并做了 webkit keyframes设置
  • Excel-DNA:F# 初始化错误 [错误] 方法未注册

    作为一名新手 F 开发人员 我尝试创建一个简单的 Excel DNA 函数 如下所示
  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • 使用 Angularjs 在选择下拉列表中设置默认值

    我有一个对象如下 我必须将其显示为下拉菜单 var list id 4 name abc id 600 name def id 200 name xyz 在我的控制器中 我有一个带有值的变量 该值决定在下拉列表中默认选择数组中的上述三项中的
  • 当我尝试运行在 GitHub 上找到的代码时,我遇到了这个问题。 Pydot 和 graphivz 已安装但仍然出现此错误[重复]

    这个问题在这里已经有答案了 2022 07 19 18 41 58 081967 W tensorflow stream executor platform default dso loader cc 64 Could not load d
  • 如何告诉 ProGuard 保留私有字段而不指定每个字段

    这是我的课 package com tools app holiday public class Holiday private String name private Calendar dateFrom Calendar getInsta
  • Git 从以前的提交范围创建分支?

    我有一个操作系统项目的一堆提交 我想将最后的 20 个提交提取到另一个分支 这样我就可以拉取请求 我怎么能这样做呢 原因是我可能有 150 次提交 但其中大部分都是为了更大的贡献 但尚未准备好 但下一个版本即将发布 Thanks 你可以这样
  • 如何在 mysql 中将 csv 文件导出到我的计算机

    我正在尝试将表以 csv 格式从远程服务器导出到我的台式计算机 我有这个代码 select from order into outfile C Users Sleep Shop Desktop MySQL Scripts outfile c
  • Scala 和 Java 的构建器库

    我需要一个可以从 Scala 和 Java 调用的构建器库 在 Scala 中使用默认的命名参数就足够简单了 但是我如何从 Java 调用这段代码呢 见下文 或者也许我应该使用两种语言都更通用的流畅 API Scala case class
  • Python:如何将输出捕获到文本文件? (现在仅捕获 530 行中的 25 行)

    我已经潜伏在 SO 上做了相当多的工作 并进行了大量的搜索和阅读 但我也必须承认 总的来说 我在编程方面是一个相对菜鸟 我正在努力边学边学 所以我一直在使用 Python 的 NLTK 在下面的脚本中 我可以让一切正常工作 除了它只写多屏幕
  • 为什么只允许动态方法跳过可见性检查?

    我正在移植使用的代码DynamicMethod广泛允许预编译 以获得更好的冷启动性能 我注意到DynamicMethod可以进行即时编译并在跳过可见性检查的情况下执行 这允许它们访问私有嵌套类型 但普通程序集不能 或者不能 我没有看到任何明
  • MVC3 远程属性 - 验证

    我有一个班级管理员 public class Admin public virtual int AdminId get set Remote UsernameAvailable Admins Display Name lblUsername
  • 当其他未缓冲的查询处于活动状态时,PDO 无法执行查询

    我知道这必须是一个简单的修复 并且我部分理解为什么会出现此错误 但不知道如何修复它 我查看了文档 但除了使用缓冲查询选项之外找不到其他解决方案 我也尝试过 但它不起作用 错误是 当其他未缓冲的查询处于活动状态时 PDO 无法执行查询 该错误
  • 跨域资源共享(CORS)概念

    我对跨域 JavaScript 的概念有疑问 有一个服务器 例如 amazon com 只有选定的域才能使用其网络服务 所以肯定的是 如果我尝试从本地使用他们的服务 我就不能 我在控制台上看到了这个 跨源请求被阻止 同源策略不允许读取 远程