在跨域请求中,根据请求的类型,请求可以分为两种主要类型:简单请求(Simple Request)和复杂请求(Preflighted Request)。
1. 简单请求(Simple Request)
简单请求是指浏览器直接发出的跨域请求,符合一定的条件,可以不经过预检(Preflight)。
一个请求被视为简单请求,需要满足以下条件:
- 请求方法是以下之一:GET、HEAD、POST。
- 请求头(HTTP headers)只包含以下几种字段之一:
- Accept
- Accept-Language
- Content-Language
- Last-Event-ID
- Content-Type(只允许部分值,如 application/x-www-from-urlencoded、multipart/form-data、text/plain)
如果一个请求满足上述条件,它就被认为是简单请求,浏览器会直接发出该请求,而不需要进行预检。
2. 复杂请求(Preflighted Request)
复杂请求是指不满足简单请求条件的跨域请求。当一个请求不满足简单请求的条件时,浏览器会先发送一个预检请求(Preflighted Request),以确定是否服务器允许该请求。
预检请求是一个使用 HTTP 方法 OPTIONS 的请求,它包含一个 Origin 头字段,用于指示请求的来源,以及一些其他额外的头字段。服务器接收到预检请求后,会检查是否允许实际请求。如果服务器允许,浏览器随后会发送实际请求。
复杂请求的情况包括但不限于以下情况:
- 使用非简单请求方法,如 PUT、DELETE 等
- 发送自定义请求头
- 发送请求的 Content-Type 头字段为非简单值,例如 application/json。
需要注意的是,对于复杂请求,服务器必须在响应中包含适当的跨域头,如 Access-Control-Allow-Origin、Access-Control-Allow-Methods 和 Access-Control-Allow-Headers,以确保请求能够成功完成。
简单请求和复杂请求的区分对于理解跨域请求以及处理跨域问题非常重要,因为它们触发的浏览器行为和服务器端的处理方式有所不同。