简单请求和复杂请求
· 阅读需 2 分钟
简单请求
使用以下方法之一
- GET
- POST
- HEAD
设置的头信息仅限于以下几种
- Accept
- Accept-Language
- Content-Language
- Content-Type(但仅限于
application/x-www-form-urlencoded
、multipart/form-data
、text/plain
) - 请求中的任何
XMLHttpRequestUpload
对象没有注册任何事件监听器;XMLHttpRequestUpload
对象可以使用XMLHttpRequest.upload
属性访问。 - 请求中没有使用
ReadableStream
对象。
满足上述条件的请求被视为“简单请求”。简单请求不会触发 CORS 预检请求(这里指的是浏览器)。
复杂请求
不符合上述简单请求条件的请求被视为复杂请求。复杂请求在正式通信之前,会先发送一个预检请求(preflight request),这是一个使用OPTIONS
方法的HTTP
请求,向服务器询问实际请求是否安全可接受。
复杂请求的特点包括
- 使用了除 GET、POST、HEAD 之外的 HTTP 方法(如 PUT、DELETE 等)。
- 人为设置的头信息超出了简单请求允许的范围。
- 向服务器发送了除允许的类型之外的
Content-Type
,如application/json
。
预检请求的目的是为了确保服务器明确允许跨源请求。服务器必须正确响应预检请求,提供相应的Access-Control-Allow-Methods
、Access-Control-Allow-Headers
等 CORS 相关的响应头,表明服务器接受实际请求。只有当预检请求成功后,浏览器才会发送实际的请求。
简单请求和复杂请求的区别主要是为了安全考虑,通过这种机制,可以避免恶意网站对跨源资源进行未经授权的访问。其实我们可以发现,除了 GET、POST、HEAD 之外,其他类型的请求都涉及到修改数据库的内容,所以为了安全,需要进行预检。只要触发了预请求就是复杂请求
如果您喜欢这篇文章,不妨给它点个赞并收藏,感谢您的支持!