CORS 跨域

云服务器89元/年,这里有专享低价:
https://www.aliyun.com/minisite/goods?userCode=f0xyki07&share_source=copy_link

或扫码


image.png

先了解几个概念:

同源策略 (Same-origin policy)

是 Web 应用程序安全模型中的一个重要概念。根据该策略,Web 浏览器允许第一个 Web 页面中包含的脚本访问第二个 Web 页面中的数据,但前提是两个 Web 页面具有相同的源。同源定义为 URI 具有相同协议、域名和端口号。此策略可防止一个页面上的恶意脚本通过该页面的文档对象模型访问另一个网页上的敏感数据。这种机制对于广泛依赖于 HTTP Cookie 来维护经过身份验证的用户会话的现代 Web 应用程序具有特别重要的意义,因为服务器基于 HTTP Cookie 信息来发布敏感信息或采取状态改变操作。必须在客户端维护由不相关站点提供的内容之间的严格分离,以防止数据机密性或完整性的丢失。同源策略主要适用于脚本的数据访问; 通过相应的 HTML 标签在源(例如图像, CSS 和脚本)之间嵌入资源不受限制(字体是一个值得注意的例外)。

JSONP (JSON with padding)

是数据格式JSON的一种“使用模式”,可以让网页从别的网域要数据。由于同源策略,一般来说位于 server1.com 的网页无法与 server2.com 的服务器沟通,而HTML的 <script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的JSON数据,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的数据并不是 JSON ,而是任意的 JavaScript ,用 JavaScript 解释器运行而不是用 JSON 解析器解析。风险是易受到跨站请求伪造(CSRF/XSRF)的攻击

跨来源资源共享 (Cross-Origin Resource Sharing, CORS)

是一份浏览器技术的规范,提供了 Web 服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略,是 JSONP 模式的现代版。与 JSONP 不同,CORS 除了 GET 请求方法以外也支持其他的 HTTP 请求。用 CORS 可以让网页设计师用一般的 XMLHttpRequest ,这种方式的错误处理比 JSONP 要来的好。另一方面,JSONP 可以在不支持 CORS 的老旧浏览器上运作。现代的浏览器都支持 CORS。

简单的说:跨域就是当浏览器向 (domain-a.com) 请求了一个资源后,该资源又去请求 (domain-b.com) 上的另一个资源时,就会发起一个跨域 HTTP 请求。 (domain-a、domain-b 的协议、域名、端口有一样不同)

以前涉及到的网站项目都是前后端在一块的(同一个服务器同一个域名下),访问的时候由 php 进行跳转页面、控制页面的输出,JavaScript 顶多发个 ajax 请求数据,不涉及到前端自己保存登录状态,也不会涉及到跨域问题。
随着前端的发展,特别是 nodejs 的出现后,由 nodejs 启动服务,前端可以不依赖后端,前端自己跑自己的业务,然后在需要数据的时候发个 ajax 去调用后端接口去取数据,所以这就是前后端分离,前端专注前端的业务,后端专注于提供自己的接口。
在前后端分离的基础上,前端和后端有可能不是同一个服务器、不是同一个域名,这时候就会有跨域的问题。

CORS 规范让 Web 应用服务器能支持跨站访问控制,从而使得安全地进行跨站数据传输成为可能。需要特别注意的是,这个规范是针对 API 容器的(比如说 XMLHttpReques 或者 Fetch),以减轻跨域 HTTP 请求的风险。CORS 需要客户端和服务器同时支持。目前,所有现代浏览器都支持该机制。

CORS 允许在下列场景中使用跨域 HTTP 请求:

  • 前文提到的由 XMLHttpRequest 或 Fetch 发起的跨域 HTTP 请求。
  • Web 字体 (CSS 中通过 @font-face 使用跨域字体资源), 因此,网站就可以发布 TrueType 字体资源,并只允许已授权网站进行跨站调用。
  • WebGL 贴图
  • 使用 drawImage 将 Images/video 画面绘制到 canvas
  • 样式表(使用 CSSOM)
  • Scripts (未处理的异常)

CORS 的请求种类:简单请求、预检请求及附带身份凭证的请求,详细可看:

解决方案

  • 配置代理服务器, Node.js 代理、Nginx 代理
  • spring framework 已提供 CORS 支持,可以通过引入注解 @CrossOrigin,或者设置全局 Cors 配置来允许跨域访问。详细见 Spring Boot Reference Guide
  • 服务器端设置:在 Controller 返回的 Rsponse 添加 Header :Access-Control-Allow-Origin: ** 代表允许所有域的访问,也可指定域。

Form 表单里面发送请求为什么会没有跨域?

首先,表单的提交方式有两种,一种是直接指定表单的 action。一种是 ajax 接手控制请求。

直接使用 action 的时候,是直接把请求交给了 action 里面的域,本身页面不会去管他的请求结果,后面的步骤就已经离开了原来的域,进入了 action 里面的域。例如:

<form action="baidu.com">
    // your form filed
</form>

上面这个表单提交后,剩余的操作就交给了 action 里面的域 baidu.com,本页面的逻辑

和这个表单没啥关系,由于不关系请求的响应,所以浏览器认为是安全的。

而使用 ajax 来控制 form 的请求的时候,页面 js 需要知道请求的返回值,这个时候,浏览器成功发出跨域请求,但需要获得授权才可以成功请求,否则返回结果会被浏览器拦截。

微前端 - 将微服务理念延伸到前端开发中

参考:

同源策略
跨域资源共享
MDN

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容

  • ajax作为前端开发必需的基础能力之一,你可能会使用它,但并不一定懂得其原理,以及更深入的服务器通信相关的知识。在...
    萧玄辞阅读 818评论 0 0
  • 前端开发中,常常需要进行跨域请求。既然提到跨域,首先我们的知道什么是“同源策略”。 同源策略限制从一个源加载的文档...
    陈小俊先生阅读 2,405评论 0 4
  • 由于浏览器对于 javascript 的同源策略的限制,如果在 A 站点的网页上希望通过 js 访问 B 站点的接...
    o黄裳元吉o阅读 4,534评论 0 2
  • 阅读目录: 深入跨域问题(1) - 初识 CORS 跨域资源共享(本篇)深入跨域问题(2) - 利用 CORS 解...
    挺哥1998阅读 722评论 0 4
  • 老屋的窗棂已经破旧 月光的心事无人能知 有时,有火烧云飘过 我仰起头,看到一片天际 后来,火烧云飘向了哪里 芦笛落...
    春风明月阅读 193评论 0 0