首页 > 其他分享 >http跨域时的options请求

http跨域时的options请求

时间:2023-06-25 18:23:00浏览次数:52  
标签:Control 浏览器 请求 预检 Content http options 跨域

来源:

https://blog.csdn.net/qq_36025814/article/details/108023035

 

_____________________________________________________________________________________________________________________________________________________________________________________________________

 

 

一、前言

  • 1、在有很多情况下,当我们在js里面调用一次ajax请求时,在浏览器那边却会查询到两次请求。第一次的Request Method参数是OPTIONS,还有一次就是我们真正的请求,比如get或是post请求方式。
  • 2、OPTIONS它用于获取当前URL所支持的方法。若请求成功,则它会在HTTP头中包含一个名为“Allow”的头,值是所支持的方法,如“GET, POST”。
  • 3、查阅相关的资料之后发现,这是浏览器对复杂跨域请求的一种处理方式,在真正发送请求之前,会先进行一次预请求,就是我们刚刚说到的参数为OPTIONS的第一次请求,他的作用是用于试探性的服务器响应是否正确,即是否能接受真正的请求,如果在options请求之后获取到的响应是拒绝性质的,例如500等http状态,那么它就会停止第二次的真正请求的访问

二、简介

  • 出于安全考虑,并不是所有域名访问后端服务都可以。其实在正式跨域之前,浏览器会根据需要发起一次预检(也就是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

在这里插入图片描述

就Content-Type为application/json为例:对比两张图片,一次预检请求,一 次正式请求:
预检请求
在这里插入图片描述

正式请求
在这里插入图片描述

  • 很明显,请求头中预检请求不会携带cookie,正式请求会携带cookie和参数。跟普通请求一样,响应头也会增加同样字段。
  • 一旦服务器通过了“预检”请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样。

四、参考地址

标签:Control,浏览器,请求,预检,Content,http,options,跨域
From: https://www.cnblogs.com/kelelipeng/p/17503661.html

相关文章

  • Nginx https配置http的图片服务
    1.在Nginx配置网站的https服务#HTTPSserver#server{listen443ssl;server_namelocalhost,10.11.1.68;ssl_certificateca.crt;ssl_certificate_keyca.key;ssl_session_cacheshared:SSL:1m;......
  • Linux使用HTTP代码示例
    以下是使用Linux命令行发送HTTP请求的示例:1.使用curl命令发送GET请求:```curl ExampleDomain```2.使用curl命令发送POST请求:```curl-XPOST-d"param1=value1&param2=value2" ExampleDomain```3.使用wget命令发送GET请求:```wget ExampleDomain```4.使用wget命令发送POST......
  • 一个亚马逊赞助的.Net轻量级、流行的HTTP客户端库
    我们在实际项目开发中,操作Http请求可以说是非常常见了,这里面就涉及到授权、格式转换、标头参数等,针对不同的项目,我们需要封装一个Http请求帮助类。所以,今天给大家推荐一个Http客户端库,就能完全满足我们的日常需求。 项目简介这是一个基于.Net开发的Http客户端库,它具备序列化......
  • Reqable HTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟替代品)
    本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!ReqableHTTP一站式开发+调试工具(小黄鸟作者另一力作、小黄鸟替代品)环境win10pixel4Android13概览官网......
  • 详解 HTTPS 概念
    我们都知道HTTPS能够加密信息,以免敏感信息被第三方获取。所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议。HTTPS简介HTTPS其实是有两部分组成:HTTPSSL/TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传......
  • IIS 下实现http强装到https
    1、准备证书①打开IIS管理控制台,双击“服务器证书”。②在弹出的窗口中,单击右上角“导入”。③导入证书文件,注意申请证书时如果填写了密码,这里也要输入相关密码。2、绑定https,让站点可以接收http和https①右击网站站点,选择“编辑绑定”②在弹出的窗口中,单击“添加”按......
  • 跨域攻击的方法介绍
    跨域攻击的方法介绍目录跨域攻击的方法介绍一、内网中的域林二、跨域攻击方法三、获取域信息四、利用域信任密钥跨域五、利用krbtgt哈希值跨域一、内网中的域林很多大型企业都拥有自己的内网,一般通过域林进行共享资源。根据不同职能区分的部门,从逻辑上以主域和子域进行区分,以方......
  • http-equiv属性
    http-equiv的几个重要属性:refresh(重定向) <meta http-equiv="refresh" content="1;url=https://www.weimob.com">此处http-equiv属性定义为refresh,值为”1;url=https://www.weimob.com”,其值实现了2个功能,并使用分号进行分割。分号前面的数值1表示时间间隔为1秒,分号后面的......
  • RPC接口与Https接口
    RPC(remoteprocedurecall)远程过程调用;Http:超文本传输协议。RPC是一种方法,http是一种协议。RPC服务主体要工作在tcp协议上,而http服务工作在http协议上,由于http协议基于tcp协议,所以rpc服务比http更轻量,效率更高RPC远程过程调用RPC效率优势明显,在实际开发中,客户端和服务端在技术......
  • java用main方法通过socket 接收实现http
    运行main方法后,可以接收http请求, 适合简单的服务器测试 代码如下:importjava.io.*;importjava.net.ServerSocket;importjava.net.Socket;publicclassDemo02{publicstaticvoidmain(String[]args)throwsIOException{finalServerSocketserverS......