跨域

2021/12/21 前端重点

# 介绍

# 同源策略

  • 协议 // 域名 : 端口号
  • 完全一致才叫同源,否则会产生跨域
  • 这个同源策略是W3C对浏览器的异步请求的限制,也就是说服务器和html内嵌的资源请求没有此限制
  • 跨域资源是可以发送的,但是接收的数据时候会被浏览器限制

# 解决方案

# JSONP

思想

  • 同源策略限制的是ajax异步请求,并没有限制内嵌的script代码,所以可以利用这一点去取对应的数据
  • 前端和后端约定好回调函数名称,然后前端创建script标签向后端指定url发起get请求,后端将回调函数执行且传入希望有的数据,前端接受到数据由于是script标签,就会开始执行,拿到数据且执行出希望的结果。
  • 限制:只能请求get数据,因为是script标签发起的请求
  • 限制:需要约定好回调函数名,较为不方便

# CORS

  • 全称:Cross-origin resource sharing
  • 服务器同意跨域的资源请求,并在响应头上添加对应字段
  • 响应头设置的字段:
字段
Access-Control-Allow-Origin 【必须】允许请求的源域名,url | *
Access-Control-Request-Method 可选,支持跨域的方法
Access-Control-Expose-Headers 可选,允许包含的请求头
Access-Control-Allow-Credentials 可选,布尔值,headers是否接收cookie字段
Access-Control-Max-Age 可选,本次预检请求有效期

# node代理

思路

  • 同源限制是浏览器规定的
  • 不限制其他平台的网络请求
  • 那么就让服务器代理发送请求,再把数据还给浏览器端,浏览器就不知道这是跨域的资源了

# Nginx

  • 原理和proxy代理一样,只是vue的proxy配置只有开发环境生效,生产环境一般用nginx

# webSocket

定义

  • 规范定义了一种 API,可在网络浏览器和服务器之间建立“套接字”连接。简单地说:客户端和服务器之间存在持久的连接,而且双方都可以随时开始发送数据。
  • 跨域原理:本质上是浏览器和服务器建立了持久链接,并不是传统的http请求,所以并没有跨域限制

# 谷歌浏览器关闭跨域

  1. 桌面新建文件夹aaa
  2. 注意路径
    pwd
    open -n /Applications/Google\ Chrome.app/ --args --disable-web-security  --user-data-dir=/Users/dreamarts/Desktop/aaa
    
    1
    2

# 其他方案

其他不常用方案

方案 适用
window.postMessage 可以向浏览器的其他窗口或内嵌iframe进行跨域通信
document.domain + iframe 可以让同一个基础域名的网页进行相互操作,如:【id.qq.com】和【qq.com】可以互相嵌套iframe进行跨域通信操作,只要把他们都设置【document.domain = 'qq.com'】
浏览器关闭跨域限制 启动增加参数【--disable-web-security --user-data-dir】

# 跨站

  • 跨站路径不完全相同:a.b.com / c.b.com / b.com
  • 服务器设置相应头SameSite=None;Secure
app1.get('/',(req,res)=>{
    res.setHeader('Set-Cookie','SameSite=None;Secure')
    res.send('ok')
})
1
2
3
4
上次更新: 9/17/2024