ajax 跨域 复杂请求,ajax 跨域请求,每次会发送两个请求?

跨域已经是个老话题了,但是最近搞百度的语音接口的时候,在服务端配置了 CORS ,跨域倒是没问题,但是每次都会发送两个请求:

15ee1ad295e7d2bf8848673f78bc311e.png

第一条的请求信息是这样的:

092920_FhbM_2399303.png

method 是 OPTIONS,并且没有返回数据

然后第二条才是正常的请求;

查了资料发现这个 OPTIONS 是浏览器的预检请求,

而导致浏览器预检的原因是浏览器认为这次跨域请求为复杂请求(not-so-simple request 非简单请求);

浏览器对简单请求的判定规则是:

(1) 请求方法是以下三种方法之一:

HEAD

GET

POST

(2)HTTP的头信息不超出以下几种字段:

Accept

Accept-Language

Content-Language

Last-Event-ID

Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

如果不能同时满足上面两个条件则为复杂请求;

而百度 API 要求了

Content-Type:audio/wav; rate=8000header 项,所以不满足简单请求;

但同时浏览器也支持对预检结果的缓存,可以通过在服务端添加header 设置缓存时间:

add_header Access-Control-Max-Age 3600;

这是在 nginx 的配置方式,3600 是秒数

但是各浏览器支持的最长缓存时间也是不一样的:

返回结果可以用于缓存的最长时间,单位是秒。在Firefox中,上限是24小时 (即86400秒),而在Chromium 中则是10分钟(即600秒)。Chromium 同时规定了一个默认值 5 秒。

如果值为 -1,则表示禁用缓存,每一次请求都需要提供预检请求,即用OPTIONS请求进行检测。

有个需要注意的地方,调试的时候如果开启了 disable cache 则是无法缓存的,

01b897a878210622b02096ab5f85388c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值