http头部字段access

发布时间 2023-04-18 17:58:26作者: 挖洞404

1、介绍

access系列字段是用于解决ajax跨域问题的一种方案,也称为CORS机制。

ajax是严格遵循同源策略的,既不能从另一个域读取数据,也不能发送数据到另一个域。当然,对于同源的来说,是可以请求和处理响应的,并携带登录凭证cookie。

注意:html元素对于浏览器不存在跨域问题。

而cors机制,并不能影响服务端是否处理跨域,只是用于解决浏览器对跨域请求的响应的处理。

2、Access-Control-Allow-Origin

响应标头指定了该响应的资源是否被允许与给定的来源(origin)共享。

Access-Control-Allow-Origin: *
Access-Control-Allow-Origin: <origin>
Access-Control-Allow-Origin: null

(1)*

对于不包含登录凭据的请求,即不要求cookie,服务器会以“*”作为通配符,从而允许任意来源的请求代码都具有访问资源的权限。尝试使用通配符来响应包含凭据的请求会导致错误

(2)指定

指定一个来源(只能指定一个)。如果服务器支持多个来源的客户端,其必须以与指定客户端匹配的来源来响应请求。如果浏览器没有接收到Access-Control-Allow-Origin字段,则会报错

注意:即使设置不允许跨域,但请求过程中已经携带数据,服务端接收,可能会进行处理

3、Access-Control-Allow-Credentials

用于告知浏览器是否允许资格证书,实际就是请求是否携带cookie的登录凭证。其值区分大小写,为true时,表示允许。

  • 这时一般浏览器的ajax会设置请求头部字段withCredentials为true,浏览器会携带跨域的cookie
  • 而且Access-Control-Allow-Origin不能设置为*,必须是指定的某个url
Access-Control-Allow-Credentials: true

4、withCredentials

这是一个请求头部字段,ajax进行设置

  • true:在跨域请求时,浏览器会携带用户凭证
  • false:默认值,在跨域请求时,不会携带用户凭证;返回的 response 里也会忽略 cookie

5、简单请求和复杂请求

简单请求:

  • 请求方式只能是:GET、POST、HEAD
  • HTTP请求头限制这几种字段(不得人为设置该集合之外的其他首部字段):
    Accept、Accept-Language、Content-Language、Content-Type(需要注意额外的限制)、DPR、Downlink、Save-Data、Viewport-Width、Width
  • Content-type只能取:application/x-www-form-urlencoded、multipart/form-data、text/plain
  • 请求中的任意XMLHttpRequestUpload 对象均没有注册任何事件监听器;XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问。
  • 请求中没有使用 ReadableStream 对象。

复杂请求:除了简单请求之外的

6、预检

浏览器对复杂跨域请求在真正发送请求之前,会先进行一次预请求,就是参数为OPTIONS的第一次请求,他的作用是用于试探性的服务器响应是否正确,即是否能接受真正的请求,如果在options请求之后获取到的响应是拒绝性质的,例如500等http状态,那么它就会停止第二次的真正请求的访问。

7、Access-Control-Request-Method

在预检请求中,用于告知服务器在真正的请求中会采用哪种http方法,预检本身的请求总是OPTIONS方法。

Access-Control-Request-Method: POST

8、Access-Control-Request-Headers

在预检请求中,用于通知服务器在真正的请求中会采用哪些请求头。

Access-Control-Request-Headers: X-PINGOTHER, Content-Type

9、Access-Control-Allow-Methods

在预检中,服务器明确了客户端所要访问的资源允许使用的方法或方法列表。

Access-Control-Allow-Methods: POST, GET, OPTIONS

10、Access-Control-Allow-Headers

在预检请求中,用于告知浏览器将会在正式请求中允许的头部字段,对于简单头部字段不会列举,始终被支持

如果请求中含有 Access-Control-Request-Headers 字段,那么这个首部是必要的。

Access-Control-Allow-Headers: X-Custom-Header, Upgrade-Insecure-Requests
Access-Control-Allow-Headers: *

11、Access-Control-Expos-Headers

用于通知浏览器,列出了哪些首部可以作为响应的一部分暴露给外部。

默认情况下,只有七种 simple response headers(简单响应首部)可以暴露给外部:

  • Cache-Control
  • Content-Language
  • Content-Length
  • Content-Type
  • Expires
  • Last-Modified
  • Pragma

如果想要让客户端可以访问到其他的首部信息,可以将它们在 Access-Control-Expose-Headers 里面列出来。

Access-Control-Expose-Headers: Content-Length, X-Kuma-Revision

12、Access-Control-Max-Age

在预检请求中,用于通知浏览器返回结果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息)可以被缓存多久

//单位为秒,值为-1表示禁用缓存,每次请求前都需要使用 OPTIONS 预检请求。而不同浏览器的最长允许缓存也有所差异
Access-Control-Max-Age: 600