博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ajax 跨域请求,每次会发送两个请求?
阅读量:6571 次
发布时间:2019-06-24

本文共 871 字,大约阅读时间需要 2 分钟。

hot3.png

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

092714_2ofk_2399303.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-urlencodedmultipart/form-datatext/plain

来自:

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

而百度 API 要求了 

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

 

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

add_header Access-Control-Max-Age 3600;

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

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

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

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

来自: 

 

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

101112_24gW_2399303.png

 

转载于:https://my.oschina.net/u/2399303/blog/1631444

你可能感兴趣的文章
arailsdemo 2
查看>>
rails 奇怪的 joins
查看>>
Bean获取与实例化
查看>>
limit_req模块应用
查看>>
gcc 怎么编译 openssl 程序?
查看>>
优化nginx服务对CPU亲和力worker_cpu_affinity
查看>>
omnicore api速查表
查看>>
MySQL Connector to J 8.0 Q&A
查看>>
Mysql纯命令行添加用户
查看>>
MongoDB分片
查看>>
Centos编译安装Nginx
查看>>
【WebApp】离线webapp (android)开发
查看>>
如何做好网站SEO优化,需要会什么?
查看>>
网站建设与管理的基本流程
查看>>
spring上传文件并限制大小配置以及全局异常处理
查看>>
Windows下NDK直接编译编译boost 1.55(X86版本)
查看>>
系统重装后重新配置mysql
查看>>
FUSIONCHART 图例清空解决 ID 占用重复
查看>>
OPPO R17谍照现身 机身采用“叠层流光点彩工艺”
查看>>
基于Docker-compose部署wiki-confluence6.10
查看>>