ajax两次请求

最近在学习的时候看到很多文章说到post和get区别的时候会提到有一个:post请求的时候会发送两条请求(分别为head和body),get请求只会发送一条???
但是真的是这样吗?
看了https://github.com/WangXiZhu/fe-storage/issues/31的文章,我发现并不是如此

$.ajax({
		url:  "https://randomuser.me/api/?results=10",
		type: 'get',
		headers: {
				"Access-Control-Allow-Origin":"*"
		 },
		success: function(data){
			console.log(data)
		},
		error: function(){}
});

打开chrome的检查发现发送了两条请求记录,一条为options,另一个为get的正常请求
在这里插入图片描述
在这里插入图片描述
将Ajax的type改为post方式进行发送,发现和get方式的结果是一样的,也是发送了两条请求记录
在这里插入图片描述
所以会发送两条请求记录和get/post方法没有什么关系,那导致这种现象的原因是什么呢?

options作用

http的options方法用于捕获目的资源所支持的通信选项,客户端可以对特定的URL使用options方法,也可以对整站(通过将URL设置为“*”)使用该方法。

Preflight request(预检请求)

一个cors预检请求是用于检查服务器是否支持cors即跨域资源共享。当有必要的时候,浏览器会自动发出一个预检请求。

为什么需要发送预检请求?

我们都知道浏览器的同源策略,就是出于安全考虑,浏览器会限制从脚本发起的跨域HTTP请求,像XMLHttpRequest和Fetch都遵循同源策略。
浏览器限制跨域请求一般有两种方式:

1 浏览器限制发起跨域请求
2 跨域请求可以正常发起,但是返回的结果被浏览器拦截了

一般浏览器都是第二种方式限制跨域请求,那就是说请求已到达服务器,并有可能对数据库里的数据进行了操作,但是返回的结果被浏览器拦截了,那么我们就获取不到返回结果,这是一次失败的请求,但是可能对数据库里的数据产生了影响。

什么情况下需要

  • 使用了除get/post/head方法之外的Http方法,如:put\delete\connect\options
  • 人为设置对cors安全的首部字段集合之外的其他首部字段
  • 在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值