HTTP之跨域

HTTP之跨域

跨域(Cors)

Cors => 跨域资源共享


同源策略:端口、域名、协议

跨域构成的条件:

  • 端口不同
  • 协议不同
  • 域名不同

只要不同源

两种请求

简单请求

两个条件:

  1. 请求方法是:HEAD,GET,POST
  2. header中只能包含以下请求字段:
    1. Accpet
    1. Accpet-Language
    1. Conten-Language
    1. Content-Type(所指的媒体类型值仅仅限于下列三者之一)
      *
      1. text/plain
        1. multipart/form-data
        1. application/x-www-form-urlencoded
浏览器不同的处理方式

对于简单请求来说,如果请求跨域,那么浏览器会放行让请求发出。浏览器会发出cors请求,并携带origin

http 复制代码
GET/cors HTTP/1.1
Origin:http://www.baidu.com
Host:api.alice.com
Accept-Language:en-US
Connections:keep-alive
User-Agent:Mozilla/5.0
...

此时不管服务端返回的是什么,浏览器都会把返回拦截,并检查返回的responseheader中有没有Access-Control-Allow-Origin,这个头部信息的值通常为请求的Origin值,表示允许该来源的请求说明资源是共享的,可以拿到。

http 复制代码
Access-Control-Allow-Origin: http://www.baidu.com
Access-Control-Allow-Credentials: true
Access-Control-Expose-Headers: FooBar
Content-Type: text/html; charset=utf-8
Access-Control-Allow-Origin

该字段是必须的。

它的值要么是请求时Origin字段的值,要么是一个*,表示接收任意域名的请求。

如果Origin头部信息的值为*(表示允许来自任何来源的请求)但这种情况下需要谨慎使用,应为它存在安全隐患。如果没有这个头信息,说明服务端没有开启资源共享,浏览器会认为这次请求失败终止这次请求,并且报错。

Access-Control-Allow-Credentials

该字段可选。

它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求中。

设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器,这个值也只能设为true,如果服务器不需要浏览器发送Cookie,删除该字段即可。

withCredentials属性

CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发送到服务器,一方面要服务器同意,指定Access-Control-Allow-Credentials字段

http 复制代码
Access-Control-Allow-Credentials:true
非简单请求

只要不满足简单请求的条件,都认为是非简单请求。


先发送OPTIONS 预检请求

OPTIONS请求按照简单请求的方式处理


目的:保护客户端的安全,防止不受信任的网站利用用户的浏览器向其他网站发送恶意请求。

  • Access-Control-Request-Method:告诉服务器实际发送的HTTP请求方法。
  • Access-Control-Request-Header:告诉服务器实际请求所携带的自定义的头部信息。
http 复制代码
OPTIONS /resources/post-here/ HTTP/1.1
Host: bar.other
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Origin: http://www.baidu.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type

服务器根据以上信息决定,该请求是否被允许

服务器回应:
http 复制代码
Access-Control-Request-Method: POST
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
什么时候会触发OPTIONS(预检请求)呢?
  1. 跨域的时候:Access-Control-Request-Headers:X-PINGOTHER,Content-Type
  2. 发送跨域的时候:使用PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH等请求方法。

好啦~这就是今天的新知识点【跨域】,看到这里有一点点了解了吗?

加油丫,正在进步的友友们~

相关推荐
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
wuyk5551 天前
《WiFi 嵌入式物联网开发全套实战》| 第 16 章 ESP32 AP+STA 双模共存原理与工程坑点
网络·stm32·物联网
XUEYUAN52121 天前
ASN 自治系统号风控:平台如何通过 IP 所属自治域批量识别代理流量
python·网络协议·http·网络安全·socks5
QYRdata1 天前
年均增速24.2%!机器人数据湖未来六年增长动能强劲
网络·机器人·服务发现
CHENKONG_CK1 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
chshang19921 天前
工业路由器是什么?浅谈5G工业网络中的IR602
网络·物联网·5g·智能路由器
萧瑟余晖1 天前
Netty 核心组件与 Reactor 模型详解
网络·架构
ITxiaobing20231 天前
IP 定位服务选型指南:从准确率到工程落地的技术考察
linux·服务器·网络
wuyk5551 天前
【Socket 进阶之路】第 9 章 Linux 网络服务量产稳定性优化|心跳保活、TIME_WAIT、SO_LINGER、内存池、断线重连、完整异常防护框架
linux·服务器·开发语言·网络·物联网
z落落1 天前
C#UDP+串口服务端+UDP 客户端(含 CRC16 校验)
网络·网络协议·udp