# 初始跨域

# 跨域是什么

同域,不是跨域

const url = './index.html'

不同域,跨域,被浏览器阻止

当前页面开打时的地址,如果在 http://127.0.0.1:5500 / 后面改为 /index.html 那么就是请求 index.html 页面它们是同域的

http://127.0.0.1:5500/json.html

如果请求地址为如下:

一个端口号为:5500,一个端口号为:8080,此时就不是同域了,需要解决跨域问题否则报错

http://localhost:8080/json
let xhr = new XMLHttpRequest()
xhr.onreadystatechange = () => {
   if(xhr.readyState != 4){
      return
   }
   if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){
      console.log(xhr.responseText)
      console.log(JSON.parse(xhr.responseText))
   }
}
// 需要解决跨域问题
xhr.open('POST','http://localhost:8080/json',true)
xhr.send(JSON.stringify(
   {
      name:"zhangsn",
      age:"18",
      hobby:["zuqi","bingbqiu"],
      userTo:{
         family:"sl",
         mother:"lidama"
      }
   }
))

请求的结果:

Access to XMLHttpRequest at 'http://localhost:8080/json' from origin 'http://127.0.0.1:5500' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
翻译:
CORS策略阻止了从源“http://127.0.0.1:5500”访问“http://localhost:8080/json”处的XMLHttpRequest:请求的资源上不存在“访问控制允许源”标头。

image-20230530170322006

向一个域发送请求,如果要请求的域和当前域是不同域,就叫跨域,不同域之间的请求,就是跨域请求,默认会被浏览器阻止。

# 什么是不用域 ,什么是同域

一个请求地址的解析:

https(协议)://www.dkx.com(域名):8080(端口号)/index.html(路径)

协议,域名,端口号任何一个不一样,就是不同域

与路径无关,路径一不一样无所谓。

根据上述,那么标题 1 中的不同域地址的问题就在于端口号的不同了,协议相同 ,地址都是本机,只有端口号不同。

http 协议对应的默认端口:80

https 协议对应的默认端口:443

# 跨域请求为什么会被阻止

阻止跨域请求,其实是浏览器本身的一种安全策略 -- 同源策略

# 跨域解决方案

优先使用 CORS 跨域资源共享,如果浏览器不支持 CORS 的话,再使用 JSONP

如何跨域查看查看详细

# 1.CORS 跨域共享资源

# CORS 是什么

Access-Control-Allow-Origin: *

表明允许所有的域名来跨域请求它,* 是通配符,没有任何限制。

只允许指定域名的跨域请求:

Access-Control-Allow-Origin:http://127.0.0.1:5500

image-20230530192931118

image-20230530192945840

# 使用 CORS 跨域过程

1. 浏览器发送跨域请求

2. 后端在响应头中添加 Access-Control-Allow-Origin 头信息

3. 浏览器接收到响应

4. 如果是同域下的 请求,浏览器不会额外做什么,这次前后端通信就圆满完成了

5. 如果是跨域请求,浏览器会从响应头中查找是否允许跨域访问

6. 如果允许跨域,通信圆满完成

7. 如果没找到或不包含想要跨域的域名,就丢弃响应结果

# CORS 的兼容性

IE10 及以上版本的浏览器可以正常使用 CORS

# 2.JSONP

# JSONP 的原理

Script 标签跨域不会被浏览器阻止

JSONP 主要就是利用 Script 标签,加载跨域文件

# 使用 JSONP 实现跨域