对 js 高程 Preflighted Reqeusts 的理解
看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. 响应实际请求.
最后
解决办法
如果你的跨域请求失败, 原因是预请求得不到正确响应
检查预请求, (那个 options 请求)的三个请求头
Origin,Access-Control-Allow-Headers,Access-Control-Request-Method服务端分别加上
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#预请求
对 js 高程 Preflighted Reqeusts 的理解的更多相关文章
- 《JS高程》创建对象的7种方式(完整版)
		
一.理解对象 ECMA-262定义对象:无序属性的集合,其属性可以包含基本值.对象或者属性. 我们可以把 ECMAScript 的对象想象成 散列表:无非就是一组 名值对,其中值可以是数据或函数. 创 ...
 - js 高程 函数节流 throttle() 分析与优化
		
在 js 高程 22.3.3章节 里看到了 函数节流 的概念,觉得给出的代码可以优化,并且概念理解可以清晰些,所以总结如下: 先看 函数节流 的定义,书上原话(斜体表示): 产生原因/适用场景: 浏览 ...
 - js 高程 22.1.4 函数绑定 bind() 封装分析
		
js 高程 书中原话(斜体表示): 22.1.4 函数绑定 另一个日益流行的高级技巧叫做函数绑定.函数绑定要创建一个函数,可以在特定的this 环境中 以指定参数调用另一个函数.该技巧常常和回调函数与 ...
 - js高程3--面向对象的程序设计--创建对象
		
创建对象 这是js高程3--第6章面向对象的程序设计--第二节创建对象的总结与自己的理解,每一种模式都有自己的优点与缺点,搞清楚它们出现的历史原因,优缺点,我们才能使用的更加游刃有余! 本片文章并没有 ...
 - 《JS高程》-教你如何写出可维护的代码
		
1.前言 在平时工作开发中,大部分开发人员都花费大量的时间在维护其他人员的代码.很难从头开始开发新代码,很多情况下都是以他人成果为基础的,或者新增修改需求,自己写的代码也会被其他开发人员调用,所以 ...
 - 吃透Javascript数组操作的正确姿势—再读《Js高程》
		
Javascript中关于数组对象的操作方法比较多也比较杂,正好再次捡起<Javascript高级程序设计>来读,把它们一一总结梳理了一下: 方法类别 方法名称 方法描述 参数 返回值 备 ...
 - 封装常用的js(Base.js)——【01】理解库,获取节点,连缀,
		
封装常用的js(Base.js)——[01]理解库,获取节点,连缀, youjobit07 2014-10-10 15:32:59 前言: 现如今有太多优秀的开源javascript库, ...
 - 《JS高程》事件学习笔记
		
事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...
 - 《JS高程》JS-Object对象整理
		
继上篇<JS高程>对象&原型笔记,对JavaScript中的Object对象进行了整理,梳理一遍~ 参考文章:详解Javascript中的Object对象 ------------ ...
 
随机推荐
- EasyUI combobox的panelHeight自动高度
			
在使用EasyUI的时候,有时会用到combobox组件,这里的记录数不是很固定,设置为auto可能会被挡住,设置固定高度时,option很少时,也很丑 所以这里给出我自己自动调整combobox的p ...
 - 使用URLConnection下载文件或图片并保存到本地
			
有时候需要从网络上面下载图片到本地进行保存,代码如下: package com.jointsky.jointframe.test; import java.io.FileOutputStream; i ...
 - JSON传参
			
通过javascript将数据组织成json格式,然后传到java后台. 注意:前台json数组传参到后台时候需要将对象(json或json数组)转换成字符串(字符串数组). Simple: 1.前台 ...
 - sensor dma alloc failed问题
			
打印信息 [CAPTURE][printCapCapbility:93]:D/ driver:sunxi-vfe [CAPTURE][printCapCapbility:94]:D/ card:sun ...
 - MySQL 5.7.16 zip包配置
			
截止2016/10/16 最新版本Mysql为5.7.16,之前写过一篇APMW搭建的文章(传送门:http://www.cnblogs.com/airoot/p/4131906.html)里面介绍的 ...
 - Python 内置模块函数filter reduce
			
1.filter()实现过滤的功能 2.reduce()对序列中元素的连续操作可以通过循环来处理 3.map()对tuple元组进行解包操作,调用时设置map()的第一个参数为None 4.使用red ...
 - hdu1331(记忆化搜索)
			
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; typed ...
 - sama5d3 环境检测 adc测试
			
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h># ...
 - CSS——伪元素
			
CSS伪元素 伪元素的语法: selector:pseudo-element {property:value;} 作 用 添加特殊样式 :first-line 伪元素 "first-l ...
 - 让浏览器下载文件http头部
			
网站提供下载服务时经常需要实现一个强制下载功能(即强制弹出下载对话框),并且文件名保持和用户之前上传时相同. 效果如下图: Content-Disposition 使用 HTTP Header 的 ...