ajax 跨域,这是最全的解决方案(一)

2020 年 1 月 09 日

ajax 跨域,这是最全的解决方案(一)

从刚接触前端开发起,“跨域”这个词就一直以很高的频率在身边重复出现,一直到现在,已经调试过 N 个跨域相关的问题了。


关于跨域,有 N 种类型,本文只专注于“ajax 请求跨域”( ajax 跨域只是属于浏览器“同源策略”中的一部分,其它的还有 Cookie 跨域 iframe 跨域,LocalStorage 跨域等这里不做介绍)


什么是 ajax 跨域


ajax 跨域的原理


ajax 出现请求跨域错误问题,主要原因就是因为浏览器的“同源策略”。


1995 年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个政策。最初,它的含义是指,A 网页设置的 Cookie,B 网页不能打开,除非这两个网页"同源"。所谓"同源"指的是"三个相同":协议相同、域名相同、端口相同。


随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制。


(1) Cookie、LocalStorage 和 IndexDB 无法读取。


(2) DOM 无法获得。


(3) AJAX 请求不能发送。


CORS 请求原理


CORS 是一个 W3C 标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出 XMLHttpRequest 请求,从而克服了 AJAX 只能同源使用的限制。


基本上目前所有的浏览器都实现了 CORS 标准,其实目前几乎所有的浏览器 ajax 请求都是基于 CORS 机制的,只不过可能平时前端开发人员并不关心而已(所以说其实现在 CORS 解决方案主要是考虑后台该如何实现的问题)。


这里整理了一个实现原理图(简化版):



如何判断是否是简单请求?


浏览器将 CORS 请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。


  • 只要同时满足以下两大条件,就属于简单请求。

  • 请求方法是以下三种方法之一:HEAD,GET,POST

  • HTTP的头信息不超出以下几种字段:

  • (1)Accept

  • (2)Accept-Language

  • (3) Content-Language

  • (4)Last-Event-ID

  • (5) Content-Type(只限于三个值 application/x-www-form-urlencoded、 multipart/form-data、text/plain)

  • 凡是不同时满足上面两个条件,就属于非简单请求。


本文转载自 Think 体验设计公众号。


原文链接:https://mp.weixin.qq.com/s/SvO1-Jcmm7_Ybmidmx6nnA


2020 年 1 月 09 日 15:56182

评论

发布
暂无评论
发现更多内容

脑洞:如何用一个整数来表示一个列表?

Python猫

Python

PostgreSQL:您可能需要增加MAX_LOCKS_PER_TRANSACTION

PostgreSQLChina

数据库 postgresql 开源

OPPO小布助手正在改变普罗米修斯的世界

脑极体

大众汽车“芯片荒”,折射汽车芯片的漫漫“自主替代”路

脑极体

由于不知线程池的bug,某Java程序员叕被祭天

Java架构师迁哥

Reactive Spring实战 -- 理解Reactor的设计与实现

binecy

reactor Reactive SpringBoot 2

大作业1

追风

架构师一期

架构师训练营W10作业

Geek_f06ede

英特尔宋继强:迈向可持续的千倍速计算未来

intel001

量化交易系统开发搭建案例

薇電13242772558

区块链 策略模式

神比喻:低代码开发像自动驾驶汽车,零代码开发像无人驾驶汽车!

低代码指南

程序员 软件 开发者 低代码 开发工具

MSHA x Chaos 容灾高可用实践

阿里巴巴云原生

数据库 高可用 云原生 中间件 容灾

学透这份300页的2020最新java面试题及答案,一线大厂offer随便拿

Java架构之路

Java 程序员 架构 面试 编程语言

2020,谁是中国ToB行业最有影响力的企业?

ToB行业头条

距离 Java 开发者玩转 Serverless,到底还有多远?

阿里巴巴云原生

Java Serverless 微服务 云原生 中间件

倍频程与钢琴调式的距离

阿里云视频云

音频技术 音频

LeetCode题解:55. 跳跃游戏,贪心,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

TypeScript | 第二章:类、接口和之间的关系

梁龙先森

typescript 前端 七日更

大连市税务局局长赵福增:用区块链打破部门间“信息孤岛”

CECBC区块链专委会

区块链 汽车

【Java入门】流

HQ数字卡

Java 七日更

GitHub上3天1W赞的程序员学习路线!入门进阶都非常实用

Java架构之路

Java 程序员 架构 面试 编程语言

图解HTTP权威指南(一)| HTTP报文

李先生

运维 HTTP

volatile,synchronized可见性,有序性,原子性代码证明(基础硬核)

叫练

volatile 多线程 synchronized 原子性 指令

比特币10年:从2个披萨涨到2万美金,背后的三个“神秘人”

CECBC区块链专委会

比特币

Redis实战丨阿里架构师耗时三年写出的Redis实战文档PDF

Java成神之路

Java 程序员 架构 面试 编程语言

云服务的可服务性经典6问

华为云开发者社区

服务 计算

13W字!腾讯高工手写“Netty速成手册”,3天能走向实战

周老师

Java 编程 程序员 架构 面试

测开之函数进阶· 第2篇《纯函数》

清菡

测试开发

阿里架构师478页Java工程师面试知识解析笔记pdf,一份2021年通往阿里的面试指南

Java架构之路

Java 程序员 架构 面试 编程语言

阿里开发10年,全部心血汇聚成到这份文档里,拿到30W的offer没问题

Java架构之路

Java 程序员 架构 面试 编程语言

“区块链+社会治理”模式获居民点赞

CECBC区块链专委会

区块链 区块链投票

ajax 跨域,这是最全的解决方案(一)-InfoQ