Skip to content

[toc]

同源策略三要素: 协议 , 域名 , 端口

跨域问题仅发生在浏览器之中,浏览器向服务器发起请求,服务器正常响应,浏览器收到响应报文后进行跨域校验。

1、JSONP(JSON with Padding)

JSONP 通过动态创建 <script> 标签实现跨域请求,利用 <script> 标签不受同源策略限制的特性。但它只支持GET请求,并且存在一定的安全风险。

2、CORS(跨域资源共享)

CORS 是目前主流的跨域解决方案,通过在服务器端设置相关的HTTP头部信息,允许在客户端发起跨域请求。它支持简单请求和复杂请求,提高了跨域请求的安全性和可控性。

设置响应头:

  • Access-Control-Allow-Origin
  • Access-Control-Max-Age
  • Access-Control-Allow-Methods
  • Access-Control-Allow-Headers
  • Access-Control-Allow-Credentials

简单请求与复杂请求

在 CORS 策略中请求可以分类简单请求与复杂请求。

  • 简单请求通常是指那些可以直接由 HTML 发起的请求,例如使用 GET 或 POST 方法的请求。这类请求的特点是它们不会改变服务端的状态,并且只使用了一些安全的头信息集合。对于简单请求,浏览器会在请求头中添加一个 Origin 字段来表示请求的源。服务器可以根据这个字段来判断是否允许该请求。
  • 复杂请求🎨 通常指的是那些需要通过 JavaScript 脚本发起,并且可能会改变服务端状态或使用了不属于简单请求头集合的请求,例如修改请求头中的 Content-Type,或者使用 PUT、DELETE 等 HTTP 方法。

对于复杂请求,浏览器会首先发送一个预检(preflight)请求,这通常是一个 OPTIONS 方法的请求。预检请求中会包含 Access-Control-Request-Headers / Methods 等字段,用以表示实际请求中将会使用的 HTTP 方法和头信息等。服务器会根据这些信息来决定是否允许实际的请求。如果服务器允许,它会在响应头中添加 Access-Control-Allow-Headers 和其他相关字段。浏览器将根据这些响应头来决定是否继续发送实际的请求。如果不允许,浏览器将返回一个错误

3、代理

由于跨域问题只发生在浏览器,可以考虑利用一个同源的代理服务器进行请求转发。