[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、代理
由于跨域问题只发生在浏览器,可以考虑利用一个同源的代理服务器进行请求转发。