跨域资源共享(CORS)是一种机制,它使用额外的HTTP头来告诉浏览器,让运行在一个origin(domain)上的 Web 应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域、协议或端口请求一个资源时,资源会发起一个跨域HTTP请求。跨域资源共享( CORS )机制允许 Web 应用服务器进行跨域访问控制,从而使跨域数据传输得以安全进行。现代浏览器支持在 API 容器中(例如 XMLHttpRequest 或 Fetch )使用 CORS,以降低跨域 HTTP 请求所带来的风险。https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS同源策略

域名、协议、端口均相同。

什么是跨域?

跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制!

我们用 koa 写一个简单的 server:

并在前端页面中请求/api接口(前端页面跑在3000端口):

因为端口不同产生了跨域,所以可以看到报错如图:

分析错误原因:没有“Access-Control-Allow-Origin”标头。但是我们能在server端的log中看到:

并不一定是浏览器限制了发起跨站请求,也可能是跨站请求可以正常发起,但是返回结果被浏览器拦截了。当我们在 server 端配置 Access-Control-Allow-Origin 标识允许哪个域的请求 (* 简单粗暴的表示所有都可以)。

前端就可以正常访问到结果了。简单请求

某些请求不会触发 CORS 预检请求。

若请求满足所有下述条件,则该请求可视为“简单请求”:

• 请求方法为 GET、HEAD、POST 时发的请求

• 人为设置了规范集合之内的首部字段,如 Accept/Accept-Language/Content-Language/Content-Type/DPR/Downlink/Save-Data/Viewport-Width/Width

• Content-Type 的值仅限于下列三者之一,即 application/x-www-form-urlencoded、multipart/form-data、text/plain

• 请求中的任意 XMLHttpRequestUpload 对象均没有注册任何事件监听器

• 请求中没有使用 ReadableStream 对象

上边的 demo 就是符合一个简单请求。预检请求不满足简单请求时,要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。“预检请求”的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。修改前端的请求,通过设置HEAD字段,使它不再是一个简单请求:

就可以看到,浏览器多发出了一个options请求:

预检请求header中包含关键字段:Access-Control-Request-Method:告知服务器,实际请求将使用的方法。Access-Control-Request-Headers:告知服务器,实际请求将携带的自定义请求header字段。服务端则需要设置相对应的:Access-Control-Allow-Methods:表明服务器允许客户端使用什么方法发起请求。Access-Control-Allow-Headers:服务器允许的自定义请求 header 中的字段。比如:(允许 header 中携带 sign 字段)

PS:koa 框架有对应的 cors 模块,使用起来会更加简单。请求携带cookies

对于跨域请求浏览器默认不会携带cookie信息,fetch方式需要设置 credentials: "include",XMLHttpRequest设置 withCredentials:"include"

服务端需要同时设置 Access-Control-Allow-Credentials:true注:如果我们在请求中设置了 credentials: "include",服务端就不能设置 Access-Control-Allow-Origin: "*"只能设置为一个明确的地址。OPTIONS请求优化

当触发预检时,跨域请求便会发送2次请求,既增加了请求数,也延迟了请求真正发起的时间,影响性能。

• 转化为简单请求• Access-Control-Max-Age 表示预请求的返回结果,即 Access-Control-Allow-Methods / Access-Control-Allow-Headers 可以被缓存多久,单位为秒。

设置缓存时间为10分钟,则一分钟只能不会重复发送 OPTIONS 请求。

options请求_跨域共享资源(CORS)和OPTIONS 请求相关推荐

  1. cors跨域_跨域,不止CORS

    我们通常提到跨域问题的时候,相信大家首先会想到的是 CORS(跨源资源共享),其实 CORS 只是众多跨域访问场景中安全策略的一种,类似的策略还有: COEP: Cross Origin Embedd ...

  2. 【AJAX 笔记】AJAX 基本、HTTP 基本、原生 AJAX 的使用,jQuery / Axios / fetch 发送请求、跨域(JSONP/CORS)

    文章目录 1 Ajax 概述 1.1 AJAX 简介 1.2 XML 简介 1.3 AJAX 的特点 1.3.1 AJAX 的优点 1.3.2 AJAX 的缺点 1.4 AJAX 属性和方法 2. H ...

  3. authorization 传 就跨域_跨域访问接口上传图片出现options请求问题解决方法

    1.首先因为服务器端会先发送一个option请求到后台  在后台返回一个post给页面 页面在处理post请求给接口 2.先写一个过滤器, 我们自己定义一个过滤器 package com.adtime ...

  4. 跨域 已被CORS策略阻止 请求的资源上没有Access-Control-Allow-Origin标头 (使用Access-Control-Allow-Origin解决跨域)

    问题:已被CORS策略阻止:请求的资源上没有'Access-Control-Allow-Origin'标头(跨域请求失败) 解决方法一 : 右击 Goolge 浏览器 ,选择属性 , 快捷方法:目标最 ...

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

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

  6. options请求(跨域预检)

    概述 options 请求就是预检请求,可用于检测服务器允许的 http 方法.当发起跨域请求时,由于安全原因,触发一定条件时浏览器会在正式请求之前自动先发起 OPTIONS 请求,即 CORS 预检 ...

  7. xmlhttprequest 跨域_跨域资源共享(CORS)安全性

    跨域资源共享(CORS)安全性 背景 提起浏览器的同源策略,大家都很熟悉.不同域的客户端脚本不能读写对方的资源.但是实践中有一些场景需要跨域的读写,所以出现了一些hack的方式来跨域.比如在同域内做一 ...

  8. 【前端44_前后端交互_跨域】前端解决:JSONP、后端解决:CORS 、后端代理

    文章目录 跨域 什么是跨域 前端解决: JSONP 实现原理 步骤 前端:创建标签,拼接传递参数 后端:接收值,返回值 封装 Ajax 代码 在封装的 Ajax 中添加 JSONP 需求 思路 练习: ...

  9. CORS跨域共享相关响应头

    CORS跨域共享相关响应头 一.CROS概念 二.支持跨域配置 三.响应头详解 四.预检请求 一.CROS概念 CORS是一个W3C标准,Cross-origin resource sharing,跨 ...

  10. AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)

    根据视频进行整理 [https://www.bilibili.com/video/BV1WC4y1b78y?p=1] 视频资料 百度网盘: 链接:[https://pan.baidu.com/s/1n ...

最新文章

  1. opencv图像恢复逆滤波_OpenCV之快速的图像边缘滤波算法
  2. 使用MLeaksFinder检测项目内存泄露总结
  3. 15合并两个排序的链表
  4. 用存储过程还原数据库
  5. 日常生活小技巧 -- 文件对比工具 Beyond Compare
  6. python定期自动运行_干货分享 | 适合 Python 入门的 8 款强大工具,不会就你还不知道吧!...
  7. 发明了计算机科学中的 bug 一词的是,为什么经常把计算机中存在的问题叫bug?...
  8. python获取网页图片_Python获取网页上图片下载地址的方法
  9. MVCWebForm对照学习:文件上传(以图片为例)
  10. EF/SQL/新闻中分页应用
  11. 前端性能优化(十一)
  12. ovirt4.4.10安装配置USB重定向
  13. Ubuntu版Julia安装与入门
  14. Javaweb常用单词
  15. 生来只为丈量天空,开普勒的传奇一生
  16. 电源完整性之DC-DC
  17. Electron编译报错:include: could not find: ****StdUtils.nsh“的解决
  18. 超全MySQL题(104道、含MySQL新特性解法)由浅入深、笔试必备!(第四部分40-52)
  19. 在线展示pdf和word并且不能显示下载和打印按钮
  20. 人生把我当成了戏子,我只好把你们当成婊子

热门文章

  1. (String)、toString()、String.valueOf区别
  2. mysql把A表的数据插入到B表
  3. 原来 Python 还有这些实用的功能和特点!
  4. 「镁客·请讲」ETC社区发起人邹来辉(Roy):我为什么要做ETC社区和狗狗币基金会?...
  5. 至少出现k次重复的子串的最大长度
  6. 《ANTLR 4权威指南》——第2章 纵 观 全 局 2.1 从ANTLR元语言开始
  7. 递归大总结之斐波那契
  8. 2015年9月01日【磁盘和文件系统管理】-JY1506402-19+liuhui880818
  9. ubuntu 14.04 32bit依赖库解决
  10. 剑指offer 29 多于一半的数