前端之ajax笔记(三)

本文由何小蒙原创,如需转载要注明来源。

个人笔记,自用,仅供参考。

跨域

跨域是前端接口请求中比较重要的点,单独开一篇记录下。

同源策略

同源策略是一个重要的安全策略,它用于限制一个origin的文档或它加载的脚本如何能与另一个源的资源进行交互。能够减少恶意文档,减少可能被攻击媒介。 如果两个URL的协议、域名、端口号都相同,就称这两个URL同源。

浏览器默认两个不同的源之间是可以互相访问资源和操作DOM的。两个不同的源之间若是想要访问资源或者操作DOM,那么会有一套基础的安全策略的制约,我们把这称为同源策略。它的存在可以保护用户隐私信息,防止身份伪造。

CORS

CORS的意思是跨资源共享,用自定义的HTTP头部让浏览器和服务器商量是否能沟通,不行浏览器(?此处确实是浏览器,为什么不是服务器)会驳回请求。跨域请求默认情况下不会携带cookie。
意思是不行这个请求就是直接没发到服务器吗?

// request headers
Origin: https://www.baidu.com

Origin是请求端告诉服务端请求来源,如上例,这个是来自百度的请求

// response headers
Access-Control-Allow-Origin: https://www.baidu.com

Access-Control-Allow-Origin 如果服务端觉得这个来源的请求可以接受,就会返回与Origin相同的来源,如上例。如果是公共资源可以返回 *


更新
1.确实是浏览器驳回跨域请求,服务器不会做处理
2.跨域请求可能会发送到服务器,也可能不会发送到服务器:
简单请求(会到服务器,服务器返回到浏览器后,浏览器隐藏返回值)
复杂请求(复杂请求会发预检,预检不通过就不会到服务器


Preflighted Request

预检请求,Preflighted Request是一种验证机制:用于验证开发人员使用自定义头部、GET或POST之外的方法,以及不同类型的主体内容。
发送预检请求,使用的是OPTION方法。

整个过程就是
请求端:我这有个麻烦的请求,先用OPTION方法问下你能不能请求啊?
服务器老弟:行,咱返回这些值告诉你。
a.不允许请求
请求端:哟,不允许请求,请求结果缓存下,Access-Control-Max-Age时间内不用重新问了。
b.允许请求
请求端:直接发送到服务端

请求端先发送这个,用OPTION方法

Origin: https://www.baidu.com
Access-Control-Request-Methods: POST 
Access-Control-Request-Headers: HeXM

Access-Control-Request-Methods是请求使用的方法
Access-Control-Request-Headers是自定义的头部信息
服务端返回

Access-Control-Allow-Orgin: https://www.baidu.com
Access-Control-Allow-Methods: POST, GET
Access-Control-Allow-Headers: HXM
Access-Control-Max-Age: 1000000

Access-Control-Allow-Methods服务器允许请求的方法
Access-Control-Allow-Headers服务器允许请求的头部
Access-Control-Max-Age应该将此预检请求缓存多少秒

OPTION.png

cookie

上文说cookie是跨域请求默认不会携带的,其实除了cookie,HTTP认证,SSL证明也是默认不会带上的。但是总有些情况需要携带,那咋办呢?

通过如下设置,我们就可以携带上述这些东西了
在请求端:

xhr.withCredentials = true

服务端HTTP头部设置:

Access-Control-Allow-Origin: 此处不能设置为*,必须要和请求同源
Access-Control-Allow-Credentials: true

如果服务端不设置Access-Control-Allow-Credentials,那么浏览器的返回值就是空,status为0,走error()的处理方法。
预检也可以发这个头部,告诉服务器咱们可以带cookie。
IE10以上的版本不支持withCredentials属性。


JSONP

老实说,我觉得JSONP使用场景比较受限,因为它只接受GET请求,但实际业务场景只用GET请求的很少,基本至少都要用到POST吧。而且如果跨的域名不安全,返回过来的信息可能也不安全。不过既然有这个技术,咱也简单了解下。

JSONP不是语法,是json的一种使用方法。

callback({"name": "HeXM"})

请求时指定回调函数的命名,如下例:
https://www.test.com/json?callback=handle
handle即为回调函数命名
然后数据会传到这个回调函数,接着前端在<script>里面处理即可。


本文参考:
同源策略(same origin policy)
跨域的请求在服务端会不会真正执行?
ajax请求携带cookie和自定义请求头header(跨域和同域)
http跨域时的options请求
MDN-Access-Control-Request-Headers

其他相关系列:
前端之ajax笔记(一)
前端之ajax笔记(二)

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

推荐阅读更多精彩内容