CORS

cors是"Cross-Origin Resource Sharing"的简称,是实现跨域的一种方式,相对于其他跨域方式,比较灵活,而且不限制发请求使用的method,以下从几种情况分析cors使用。

GET跨域请求

  • 前端代码

    fetch('http://localhost:6888/test_get',{method: 'GET',mode: 'cors',
    }).then(res => {return res.json();
    }).then(json => {console.log('获取的结果', json.data);return json;
    }).catch(err => {console.log('请求错误', err);
    })
  • 后端代码相关配置

    c.Header("Access-Control-Allow-Origin", "*")
    c.Header("Access-Control-Allow-Methods", "GET, POST")
  • 响应(response)头部特殊部分

POST跨域请求

  • 前端代码

    fetch('http://localhost:6888/test_post',{method: 'POST',body: JSON.stringify({name: 'zaozuo'}),mode: 'cors',
    }).then(res => {return res.json();
    }).then(json => {console.log('获取的结果', json.data);return json;
    }).catch(err => {console.log('请求错误', err);
    })
  • 后端代码同get相同
  • 响应(response)头部特殊部分同get相同

PUT跨域请求

  • 前端代码

    fetch('http://localhost:6888/test_put',{method: 'PUT',body: JSON.stringify({name: 'zaozuo'}),mode: 'cors',
    }).then(res => {return res.json();
    }).then(json => {console.log('获取的结果', json.data);return json;
    }).catch(err => {console.log('请求错误', err);
    })
  • 后端代码同get、post相同
  • 请求(request)头部特殊部分
  • 响应(response)头部特殊部分

  • 不同于get、post请求的地方是请求有个预检查(OPTIONS请求),然后再发put请求;上面的头部信息都是options请求相关的,put请求跟平时普通http请求一样。

思考

  1. 同是跨域请求,为什么put有预检查,而get和post都没有
  2. 上面提到的跨域头部信息的值都是干什么的,还有没有其他特殊头可能用到

问题一

跨域请求分简单请求和非简单请求,简单请求跨域只发送一个请求,不会发送options请求进行预检查,而非简单请求有预检查,那什么是简单请求,什么又是非简单请求呢。

  • 简单请求(满足以下一种情况即可)
  1. 请求method是get、head或者post
  2. 除了用户代理自动设置的一些头部,开发工程师手动设置的头部是如下头部之一:
    Accept
    Accept-Language
    Content-Language
    Content-Type
    Last-Event-ID
    DPR
    Save-Data
    Viewport-Width
    Width
  3. content-type是application/x-www-form-urlencoded、 multipart/form-data或者text/plain
  4. 没有事件注册到XMLHttpRequestUpload上
  5. 在请求时没有使用ReadableStream
  • 非简单请求
    不是简单请求,就是非简单请求喽。

问题二

  • request跨域头部介绍

    • Access-Control-Allow-Origin:可以允许哪些客户端来访问,指可以是*,也可以是某个域名或者用逗号隔开的域名列表。
    • Access-Control-Expose-Headers: 浏览器可以访问的一些头部。
    • Access-Control-Max-Age:预检查结果可以缓存的问题
    • Access-Control-Allow-Methods:指定客户端发请求可以使用的方法
    • Access-Control-Allow-Headers:指定客户端发请求可以使用的头部。
    • Access-Control-Allow-Credentials: 指定客户端是否可以携带cookie等认证信息(前端fetch设置withCredentials:true进行发送cookie),如果是简单请求等跨域得确保此response头设置为true。
  • response头部

    • Access-Control-Allow-Origin:可以允许哪些客户端来访问,指可以是*,也可以是某个域名或者用逗号隔开的域名列表。
    • Access-Control-Expose-Headers: 浏览器可以访问的一些头部。
    • Access-Control-Max-Age:预检查结果可以缓存的问题
    • Access-Control-Allow-Methods:指定客户端发请求可以使用的方法
    • Access-Control-Allow-Headers:指定客户端发请求可以使用的头部。
    • Access-Control-Allow-Credentials: 指定客户端是否可以携带cookie等认证信息(前端fetch设置withCredentials:true进行发送cookie),如果是简单请求等跨域得确保此response头设置为true。

总结

以上提到的头部信息,大部分只在预检查部分出现。

fetch 跨域请求相关推荐

  1. express框架+fetch/axios.js(本机实现跨域请求)

    之前实现过使用jQuery-Ajax跨域请求,写过一个专题:jQuery-Ajax实现跨域 Promise实现跨域 使用Promise也可以实现跨域请求. 普通的Promise模板: var p = ...

  2. html跨域post请求,使用fetch跨域POST请求

    首先,直接上代码: var url='http://localhost/test'; fetch(url, { method: "POST", mode: "cors&q ...

  3. 详细记录如何在跨域请求中携带cookie

    1. 搭建环境 1.生成工程文件 npm init 2.安装 express npm i express --save 3.新增app1.js,开启服务器1 端口:3001 const express ...

  4. 前端跨域请求get_(单点登录)跨域SSO看这篇文章就够了:前端篇

    前言 前俩篇文章,我们从概念,聊到了服务器中设计的内容.不知道大家是否觉得通俗易懂呢? 接下来的内容则有些偏向前端部分. 正文 三.Cookie传递 3.1.通过URL参数实现跨域信息传递 我们要在A ...

  5. fetch ajax cros,由 Fetch 跨域 看 CORS

    最近在看 react 获取服务器数据时, 看到了一新的 API fetch, 上手来用了用,觉得十分好用.但是使用的过程中遇到了一些问题,还是决定整体的记录下. fetch 类似于 Ajax, 区别自 ...

  6. yii2 跨域请求配置_如何在SpringBoot应用中实现跨域访问资源和消息通信?

    允许跨域访问 CORS ( Cross Origin Resource Sharing,跨域资源共享)机制允许Web应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行.浏览器支持在API容器中 ...

  7. 跨域请求传递Cookie

    通过CORS跨域时,浏览器不会自动带上cookie.想要传递cookie,需要客户端与服务端共同设置. 服务端需要设置 Access-Control-Allow-Origin 该字段表明服务端接收哪些 ...

  8. corspost请求失败_记一次 CORS 跨域请求出现 OPTIONS 请求的问题及解决方法

    今天前后端在联调接口的时候,发生了跨域请求资源获取不到的问题. 首先说明下跨域问题的由来.引自HTTP 访问控制 的一段话: 当 Web 资源请求由其它域名或端口提供的资源时,会发起跨域 HTTP 请 ...

  9. 跨域请求解决方案及详解

    1. 什么是跨域 跨域,是指浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制. 同源策略限制了一下行为: Cookie.LocalStorage ...

最新文章

  1. OpenCV+python:读取图片和视频详细信息
  2. WatchStor观察:思科携EMC等合作伙伴 圈地数据中心市场
  3. VMware vSphere Client安装Centos7
  4. 《深入理解Java虚拟机》读书笔记八
  5. mybatisplus坑 insert标签insert into select无参数问题
  6. unbuntu cmake安装mysql_Ubuntu下源码安装MySQL-5.5.25a
  7. 二叉链表之寻找两节点的最近公共祖先☆
  8. 最新手机号段归属地数据库 (2021年4月版) 473101行
  9. 【答题助手】只用2秒!搞定百万英雄 芝士超人 冲顶大会
  10. 黑马程序员—八期黑马,我放弃了
  11. 采用ATSC标准、欧洲DVB-T和日本ISDB-T标准的国家
  12. swoole 协程与go 协程对比
  13. 腾达无线路由器怎么建立服务器,如何在腾达建立无线路由器 | 192.168.1.1手机登陆...
  14. 信号完整性分析学习--12--IBIS模型
  15. 详解爬电距离和电气间隙
  16. SpringBoot——日志文件
  17. SQL DATENAME(month,getdate())返回的数据为英文日期及把日期转为字符去比较的性能问题
  18. 中考计算机加试及格多少分,中考总分多少 中考各科分数是多少
  19. 解决关于电脑跳出一些垃圾弹窗的问题
  20. c语言实验求最小值,最小值c语言流程(C语言求最小值程序)

热门文章

  1. 《C++面向对象高效编程(第2版)》——2.20 什么是多线程安全类
  2. Solr -- Solr Facet 1
  3. 2012年11月14日学习研究报告
  4. 有感于“政府傍大款”----谈中小企业融资问题
  5. 干货 | 华尔街留下的指标之王(附代码展示)
  6. form表单序列化去除空值
  7. 使用js的indexOf,lastIndexOf,slice三函数轻易得到url的服务器,路径和页名
  8. 为什么基类的析构函数要声明成虚函数
  9. 学习OpenCV——粒子滤波(网上两篇文章总结)
  10. GitLab 8.3.3 发布 开源代码管理