跨域 & options请求

一、什么是options请求

在正式发起跨域http请求之前,浏览器会根据需要发起一次预检(option请求),用来让服务端返回请求允许的方法(如get、post),orgin(来源|域名),以及是否需要Credentials(认证信息)等。

二、什么情况下

浏览器将CORS请求分为两类:简单请求(simple request)和非简单请求(not-simple-request),简单请求浏览器不会预检,而非简单请求会预检。这两种方式怎么区分?

同时满足下列三大条件,就属于简单请求,否则属于非简单请求

  • 请求方式只能是:GET、POST、HEAD
  • HTTP请求头限制这几种字段:Accept、Accept-Language、Content-Language、Content-Type、Last-Event-ID
  • Content-type只能取:application/x-www-form-urlencoded、multipart/form-data、text/plain

三、简单请求 非简单请求

简单请求

对于简单请求,浏览器直接请求,会在请求头信息中,增加一个origin字段,来说明本次请求来自哪个源(协议+域名+端口)。服务器根据这个值,来决定是否同意该请求。服务器返回的响应会多几个和跨域相关的头信息字段

  • Access-Control-Allow-Origin:该字段是必须的,* 表示接受任意域名的请求,还可以指定域名
  • Access-Control-Allow-Credentials:该字段可选,是个布尔值,表示是否可以携带cookie,(注意:如果Access-Control-Allow-Origin字段设置*,此字段设为true无效)
  • Access-Control-Allow-Headers:表明服务器允许请求中携带字段 ,如Cache-Control、Content-Type、Expires等
  • Access-Control-Max-Age:有效时间,在有效时间内,浏览器无须为同一请求再次发起预检请求

非简单请求

非简单请求是对那种对服务器有特殊要求的请求,比如请求方式是PUT或者DELETE,或者Content-Type字段类型是application/json。都会在正式通信之前,增加一次HTTP请求,称之为预检。

浏览器会先询问服务器,当前网页所在域名是否在服务器的许可名单之中,服务器允许之后,浏览器会发出正式的XMLHttpRequest请求,否则会报错。(备注:之前碰到预检请求后端没有通过,就不会发正式请求)

就Content-Type为application/json为例:对比两张图片,一次预检请求,一 次正式请求:
在这里插入图片描述在这里插入图片描述
很明显,请求头中预检请求不会携带cookie,正式请求会携带cookie和参数。一旦服务器通过了“预检”请求,以后每次浏览器正常的CORS请求,就都跟简单请求一样

【注意】

若后端设置了拦截器拦截请求,并对不携带cookie或者token的请求不放行。此时应该考虑到放行options请求,因为该请求header中不会携带cookie或者token

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当使用HTTPS进行跨域请求时,浏览器会先发送一个OPTIONS请求,以确认服务器是否允许跨域请求。这个OPTIONS请求包含了一些请求头信息,例如Origin、Access-Control-Request-Method、Access-Control-Request-Headers等。服务器需要根据这些请求头信息,返回一个响应头信息,例如Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等。只有当服务器返回的响应头信息中包含了Access-Control-Allow-Origin,且值为请求头中的Origin时,浏览器才会发送真正的跨域请求。 ### 回答2: 在进行跨域请求时,浏览器会先发送一个OPTIONS请求,以确认对方服务器是否支持跨域请求,并确定哪些请求方式和头部信息可以被允许。这种请求被称为“预检请求(Preflight Request)”。 OPTIONS请求的HTTP方法是一种请求方式,它类似于GET、POST、PUT、DELETE等常见的HTTP请求方法,但它的目的不是获取资源,而是对服务器发起一个探测性请求,以获取服务器对跨域请求的支持情况,从而安全地执行跨域请求OPTIONS请求一般包含如下信息: 1.请求方式:OPTIONS 2.请求头部信息:包括请求的URL、协议版本、请求的Host、Origin(指请求方的域名或IP地址)、Access-Control-Request-Method、Access-Control-Request-Headers(指发送请求时携带的自定义头部信息),这些数据将告诉对方服务器,请求方的支持是否满足对方服务器的要求。 3.响应头部信息:对方服务器从请求头部信息中获取到了想要的信息之后,会回复一个响应头部信息,包括允许 CORS 的 Origin、支持的HTTP请求方法、支持的头部信息等等。 在进行跨域请求时,浏览器会先发送一个OPTIONS请求,以确认对方服务器是否支持跨域请求,并确定哪些请求方式和头部信息可以被允许。这种请求被称为“预检请求(Preflight Request)”。 对于接收到OPTIONS请求的服务器,如果它允许跨域请求,就会在响应头中加入Access-Control-Allow-Origin、Access-Control-Allow-Methods等字段来告诉浏览器可以进行跨域请求。如果不允许跨域请求,则响应头中不会包含这些字段。 ### 回答3: 在进行跨域请求时,浏览器会先发送一个options请求来询问服务器是否允许跨域请求,并携带自身的请求方法、请求头、请求域等信息。这样可以避免在真正发送请求时发生意外的错误。 Options请求通过http请求头中的"Access-Control-Request-Method"和"Access-Control-Request-Headers"字段,告知服务器客户端想要采用的请求方式和请求头。如果服务器允许客户端使用这些方式,它会在返回的响应头中添加"Access-Control-Allow-Methods"和"Access-Control-Allow-Headers"字段,指明允许的请求方式和请求头,同时也可以指定允许跨域请求的域名。 此外,还可以通过"Access-Control-Max-Age"字段指定响应信息在客户端浏览器本地缓存的时间,减少重复的Options请求。 如果服务器不允许客户端进行跨域请求,响应头中会包含"Access-Control-Allow-Origin"字段并设置为"*",表示拒绝所有跨域请求。这时,浏览器会收到一个403 Forbidden错误。 需要注意的是,在进行跨域请求时,请求前端也需要在请求头中添加Origin字段,告知服务器此请求的源地址。这样服务器才能知道这个请求是否来自允许跨域请求的源,并进行相应的处理。如果没有这个字段,服务器会认为这是两个不同的域名之间的普通请求,导致跨域请求失败。 因此,了解Options请求的原理和具体操作可以帮助我们在进行跨域请求时更加顺利地处理跨域问题,提高开发效率和用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值