一、简介
出于安全考虑,并不是所有域名访问后端服务都可以。其实在正式跨域之前,浏览器会根据需要发起一次预检(也就是option请求),用来让服务端返回允许的方法(如get、post),被跨域访问的Origin(来源或者域),还有是否需要Credentials(认证信息)等。那么浏览器在什么情况下能预检呢?

二、两种请求方式
浏览器将CORS请求分为两类:简单请求(simple request)和非简单请求(not-simple-request),简单请求浏览器不会预检,而非简单请求会预检。这两种方式怎么区分?

同时满足下列三大条件,就属于简单请求,否则属于非简单请求

1.请求方式只能是:GET、POST、HEAD

2.HTTP请求头限制这几种字段:Accept、Accept-Language、Content-Language、Content-Type、Last-Event-ID

3.Content-type只能取:application/x-www-form-urlencoded、multipart/form-data、text/plain

对于简单请求,浏览器直接请求,会在请求头信息中,增加一个origin字段,来说明本次请求来自哪个源(协议+域名+端口)。服务器根据这个值,来决定是否同意该请求,服务器返回的响应会多几个头信息字段,如图所示:上面的头信息中,三个与CORS请求相关,都是以Access-Control-开头。

1.Access-Control-Allow-Origin:该字段是必须的,* 表示接受任意域名的请求,还可以指定域名

2.Access-Control-Allow-Credentials:该字段可选,是个布尔值,表示是否可以携带cookie,(注意:如果Access-Control-Allow-Origin字段设置*,此字段设为true无效)

3.Access-Control-Allow-Headers:该字段可选,里面可以获取Cache-Control、Content-Type、Expires等,如果想要拿到其他字段,就可以在这个字段中指定。比如图中指定的GUAZISSO

非简单请求是对那种对服务器有特殊要求的请求,比如请求方式是PUT或者DELETE,或者Content-Type字段类型是application/json。都会在正式通信之前,增加一次HTTP请求,称之为预检。浏览器会先询问服务器,当前网页所在域名是否在服务器的许可名单之中,服务器允许之后,浏览器会发出正式的XMLHttpRequest请求,否则会报错。(备注:之前碰到预检请求后端没有通过,就不会发正式请求,然后找了好久原因,原来后端给忘了设置…)Java后端实现拦截器,排除Options

很明显,请求头中预检请求不会携带cookie,正式请求会携带cookie和参数。跟普通请求一样,响应头也会增加同样字段。

一旦服务器通过了“预检”请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样。

作者:Alvin_9d9c
链接:https://www.jianshu.com/p/5cf82f092201
来源:简书

http跨域时的options请求相关推荐

  1. thinkphp fastadmin 解决vue前后端分离项目的跨域问题 以及 OPTIONS请求类型

    fastadmin的专用方法: 修改文件:application/config.php,这是fa的配置文件. 修改属性 cors_request_domain,搜一下就找到了,在里面加上你的域名就行了 ...

  2. ajax跨域jsonp并且post请求No 'Access-Control-Allow-Origin'以及执行error时readyState=4同时status=200的解决方法

    ajax跨域jsonp并且post请求No 'Access-Control-Allow-Origin'以及执行error时readyState=4同时status=200的解决方法 [网上很多网友的回 ...

  3. CORS跨域时axios无法获取服务器自定义的header信息 - 番外篇

    已解决CORS跨域时axios无法获取服务器自定义的header信息?! 先看代码: // 登录后的表单提交ajaxRegisterApi: function (form) { var key = l ...

  4. vue跨域拦截浏览器options预检

    当你跨域访问接口的时候,会发现你的接口请求了两次,然后仔细对比一下会发现请求类型并不一致,一个是OPTIONS,另一个是你的POST请求.事情是这样发生的,当浏览器发现你准备跨域进行非简单请求的时候( ...

  5. JAVA解决OPTIONS请求问题:跨域时ajax发送两次请求,其中options预请求参数为null及其解决方案

    转载请注明出处 原文链接:https://blog.csdn.net/qq_39309348/article/details/103267908 在正式跨域的请求前,浏览器会根据需要,发起一个&quo ...

  6. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(二)

    二.跨域: 回到顶部 跨域知识介绍: 点我以前博客 跨域解决方法:CORS:跨域资源共享 CORS请求分类(简单请求和非简单请求) 简单请求(simple request):只需要在头信息之中增加一个 ...

  7. Django框架深入了解_05 (Django中的缓存、Django解决跨域流程(非简单请求,简单请求)、自动生成接口文档)(一)

    阅读目录 一.Django中的缓存: 前戏: Django中的几种缓存方式: Django中的缓存应用: 二.跨域: 跨域知识介绍: CORS请求分类(简单请求和非简单请求) 示例: 三.自动生成接口 ...

  8. CROS实现跨域时授权问题(401错误)的解决

    http://www.open-open.com/lib/view/open1463878276539.html 如果我们访问的资源是不需要授权的,也就是在HTTP请求头中不包含 authentica ...

  9. ajax跨域时使得后台的sessionid不断地的变化,以及layui表格支持跨域的方法,java

    java+ajax跨域sessionid不断变化 由于实现一个功能,需要实现一个在过滤器中使用session的程序, 结果在前端使用ajax访问后台时,后台一直不能获取session存的值,导致了某一 ...

最新文章

  1. Java设计模式(代理模式-模板方法模式-命令模式)
  2. 博客园电子月刊[第一期]
  3. 中怎么均化走线_PCB板上多长的走线才是传输线?答案是……
  4. python logger_Python:logging 的巧妙设计!
  5. 设计模式——“signleton”
  6. ALSA DAPM创建codec到codec的dai连接
  7. nupkg 本地安装_使用Nuget安装脱机软件包nupkg
  8. vue导出Excel
  9. Win7简单方法让笔记本变身无线热点,共享手机上网
  10. 【java毕业设计】基于javaEE+Mybatis的WEB仓库管理系统设计与实现(毕业论文+程序源码)——仓库管理系统
  11. 手机html在哪个文件里,手机相册在哪个文件夹,教您手机图片存放在哪里
  12. win10安装java环境15版_win10系统安装jdk的配置方法
  13. win10打开凭据管理器提示0x800706BA
  14. 关于js表格固定列实现
  15. Python语言程序设计(嵩天老师)-期末考试3.2-站队顺序输出
  16. Ubuntu安装图形界面(桌面)
  17. 高级编程语言的发展历程(机器语言、汇编语言、高级语言)
  18. 数字信号处理的MATLAB实践(一)语音信号的录制和读取
  19. PADS Layout添加工艺边和Mark的方法和步骤
  20. 北京旅游爬长城时拍的只鸟?乌鸦?

热门文章

  1. python:实现声音转文字(附完整源码)
  2. 模拟滚动电子显示屏(自定义文本、置顶、透明度、颜色、速度、位置等)
  3. 苹果官方降价的原因找到了,它也面临销量下滑乃至出现库存问题
  4. 如何才能在视频下方添加字幕内容
  5. 如何用VOSviewer分析CNKI关键词共现?
  6. CSS中的BFC是什么?怎么用?
  7. 计算机专业是否买笔记本好还是台式好,大学新生是买台式电脑还是笔记本电脑好?游戏专业新生买外星人还是台式机...
  8. Winforms 2020界面开发新纪元——Gantt/布局和导航控件升级
  9. JS获取元素的transform属性
  10. 爱施德继续盈利背后:业绩波动明显,投资一公司累计亏损约4亿元