看JS高程遇到 Preflighted Reqeusts不大理解,遂百度下:

转自:http://todoit.me/ajax-preflight/

最近在做一个 VUE 的项目的时候, 和后端的小伙伴对接口, 想方便开发, 于是要求后端的小伙伴在所有的接口都加上跨域的许可 (Access-Control-Allow-Origin)

(后来事实证明这不是一个很好的解决方案, 因为 vue-cli 提供了 proxy-table 作为 AJAX请求的代理, 只需要配置一下就好, 编译上线也不要改动代码)

however, 经过这次折腾, 学到了preflight request的姿势

preflight request 预请求

当你在跨域的情况下发送一个非简单请求时:

浏览器预先发送一个 OPTIONS 请求, 来查明这个跨站请求对于目的站点是不是安全可接受的 当服务端对 OPTIONS 请求返回表示支持跨域请求的 Origin, method, headers 时, 浏览器才会发送你所需要的真正的跨域请求

什么是简单请求
  • 只使用 GET, HEAD 或者 POST 请求方法。如果使用 POST 向服务器端传送数据,则数据类型 (Content-Type) 只能是 application/x-www-form-urlencoded, multipart/form-data 或 text/plain中的一种。
  • 不包含自定义请求头
举个栗子
1. 发送预请求

我实际向服务端提交一个跨域的POST 请求, 请求的 Content-Type 是application/json, 这是一个非简单请求, 所以浏览器会发送一个 method 为 OPTIONS的预请求, 到服务端查询是否支持该跨域请求

请求信息:

Request URL: http://stu.dev/post
Request Method:OPTIONS
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Origin:http://localhost:8080  

OK, 注意后面三行

Access-Control-Request-Method: 在发出预检请求时带有这个头信息, 告诉服务器在实际请求时会使用的请求方式

Access-Control-Request-Headers: 在发出预检请求时带有这个头信息, 告诉服务器在实际请求时会携带的自定义头信息. 如有多个, 可以用逗号分开.

Origin: 表明发送请求或者预请求的域

2. 服务端响应预请求
Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Origin:*
Allow:GET,HEAD,POST

服务端需要对预请求里对应的三个头进行响应:

Access-Control-Allow-Headers:Content-Type: 表明服务端支持该跨域请求(实际请求)的请求头, 对应预请求里的Access-Control-Request-Headers:content-type

Access-Control-Allow-Origin:*: 表明服务端支持跨域响应的域, 对应对应预请求里的Origin

Allow:GET,HEAD,POST 表明服务端支持该跨域请求的 Method

预请求的所有跨域头得到允许以后(及以上三个请求头一一对应), 浏览器才会发送实际请求, 所以服务端要根据预请求响应这三个请求头

3. 发送实际请求.
4. 响应实际请求.
最后
解决办法

如果你的跨域请求失败, 原因是预请求得不到正确响应

  1. 检查预请求, (那个 options 请求)的三个请求头Origin, Access-Control-Allow-Headers, Access-Control-Request-Method

  2. 服务端分别加上

    Access-Control-Allow-Origin: <预请求的 Origin 内容 | * >,

    Access-Control-Request-Headers:<预请求的Access-Control-Request-Headers内容>

    Allow:<预请求的Access-Control-Request-Method的内容>

    这几个响应头

over.

案例参考:

打开http://www.uscfinvestments.com/usci,查看XHR中的https://cssecure.alpsinc.com/api/v1/dailyprice/usci的请求

参考

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/AccesscontrolCORS

https://www.w3.org/TR/cors/#resource-preflight-requests

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Server-SideAccessControl#预请求

转载于:https://www.cnblogs.com/xianshenglu/p/8401134.html

对 js 高程 Preflighted Reqeusts 的理解相关推荐

  1. [js] 说说你对js对象生命周期的理解

    [js] 说说你对js对象生命周期的理解 一切皆对象 咱们经常听到JS中"一切皆对象"?有没有问想过这是什么意思?其它语言也有"一切皆对象"之说,如Python ...

  2. js 添加属性_轻松理解JS中的面向对象,顺便搞懂prototype和__proto__

    这篇文章主要讲一下JS中面向对象以及 __proto__,ptototype和construcator,这几个概念都是相关的,所以一起讲了. 在讲这个之前我们先来说说类,了解面向对象的朋友应该都知道, ...

  3. JS中同步与异步的理解

    你应该知道,javascript语言是一门"单线程"的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条 ...

  4. JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后

    Brief 一天有个朋友问我"JS中计算0.7 * 180怎么会等于125.99999999998,坑也太多了吧!"那时我猜测是二进制表示数值时发生round-off error所 ...

  5. js 闭包及其相关知识点理解

    本文结合个人学习及实践,对闭包及相关知识点进行总结记录,欢迎读者提出任何不足之处 一.js变量 二.作用域(scope) 三.[[scope]] 和 scope chain 四.作用域(scope)和 ...

  6. 关于js浅拷贝与深拷贝的理解

    前端开发中,一般情况下,很少会去在意深拷贝与浅拷贝的关系. 大家知道,js变量有2种数据类型:基本类型和引用类型.基本类型的拷贝是将整个值完全拷贝一份的,也就是深拷贝.就是开辟了新的堆内存.所以基本类 ...

  7. js中的prototype的理解

    2019独角兽企业重金招聘Python工程师标准>>> JS中的prototype是JS中比较难理解的一个部分 1 原型法设计模式 在.Net中可以使用clone()来实现原型法 原 ...

  8. JS中[感叹号]function(){}()的理解

    这种写法,是一种`立即执行函数`的写法,即IIFE等设计模式.这种函数在函数定义的地方就直接执行了. 理解IIFE设计模式的关键是要认识到,在ES6之前,JavaScript仅具有函数作用域(因此缺少 ...

  9. JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后 1

    Brief 一天有个朋友问我"JS中计算0.7 * 180怎么会等于125.99999999998,坑也太多了吧!"那时我猜测是二进制表示数值时发生round-off error所 ...

最新文章

  1. BeanShell使用json.jar包处理Json数据
  2. 创建oracle数据库有哪些方法,oracle11g创建数据库的方法-Oracle
  3. python埋点自动化_iOS自动化埋点的实现
  4. Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)
  5. LeetCode 250. Count Univalue Subtrees
  6. Angular的Zone-Evergreen在SAP Spartacus中的应用
  7. 中国互联网安全大会将召开 网络安全再获关注
  8. 为什么物联网与云计算是天作之合
  9. 0130 - 构建业务的能力
  10. div模拟textarea在ios下不兼容的问题解决
  11. 关于js中的冒泡事件
  12. MongoDB 安全与认证
  13. Kafka权威指南 —— 读书笔记
  14. 京东淘宝等电脑网页打不开的解决办法
  15. read/write函数
  16. Linux Vim搜索替换命令详解 :%s/foo/bar/g
  17. java--for循环的三种写法
  18. Linux下 vim的基本配置
  19. 网页设计(三)——JavaScript
  20. AI绘画火了!一文看懂背后技术原理

热门文章

  1. mysql 日志记录 archive_完美起航-Mysql日志管理、备份与恢复
  2. JavaWeb开发概念了解
  3. 课程设计完成之后要考虑的问题
  4. python求最小值不能使用min和sotred_python基础——内置函数
  5. 『数据库』数据库笔记
  6. 2019.9.19最小生成树知识点总结
  7. 计组—中央处理器(CPU)
  8. LeetCode Hot100 ---- 动态规划专题
  9. Opencv3编程入门学习笔记(二)之显式创建Mat对象
  10. 内存分配方式以及堆和栈的区别