1, post为什么会发送两次请求?
因为跨域资源访问时,复杂请求会触发一次预检请求OPTIONS
- 浏览器发送预检请求,询问服务器是否允许跨域;
- 服务器响应,明确指出允许的方法和头信息;
- 浏览器确认可以跨域,发送真正的请求。
1, 简单请求:
- HTTP 方法限制:只能使用 GET、HEAD、POST 这三种 HTTP 方法之一。如果请求使用了其他 HTTP 方法,就不再被视为简单请求。
- 自定义标头限制:请求的 HTTP 标头只能是以下几种常见的标头:
Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type(仅限于application/x-www-form-urlencoded、multipart/form-data、text/plain)。HTML 头部 header field 字段:DPR、Download、Save-Data、Viewport-Width、WIdth。如果请求使用了其他标头,同样不再被视为简单请求。 - 请求中没有使用 ReadableStream 对象。
- 不使用自定义请求标头:请求不能包含用户自定义的标头。
- 请求中的任意 XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问
2,预检请求 预检请求的头信息包括两个特殊字段:
-
Access-Control-Request-Method:该字段是必须的,用来列出浏览器的 CORS 请求会用到哪些 HTTP 方法,如 POST。
-
Access-Control-Request-Headers:该字段是一个逗号分隔的字符串,指定浏览器 CORS 请求会额外发送的头信息字段,如
content-type,x-secsdk-csrf-token。 -
access-control-allow-origin:如
https://juejin.cn可以请求数据,也可以设置为*符号,表示统一任意跨源请求。 -
access-control-max-age:该字段可选,用来指定本次预检请求的有效期,单位为秒。如,有效期是 1 天(86408 秒),即允许缓存该条回应 1 天(86408 秒),在此期间,不用发出另一条预检请求。