用Postman调试跨域问题
前言
跨域问题我已经遇到许多次了,每次都是搞得满头问号,这次要把这个问题彻底梳理一下,弄明白问题的根源,以后就不会再手忙脚乱了。
跨域问题,大佬的这篇文章《SpringBoot配置Cors解决跨域请求问题》原理及解决方法写的非常好,强烈推荐,我下面的内容主要是讲后端开发如何进行调试。
另外,了解一下 Http 的内容协商机制,也有助于我们解决跨域问题,推荐下这篇文章《HTTP 协议中 Vary 的一些研究》
跨域问题
首先,跨域问题本质是因为浏览器的同源策略导致的。
1. 浏览器会为请求头添加 Origin、Host 两个字段,分别代表请求来源站点、请求的目标站点(域名或者ip+端口)。
2. 服务器收到请求后,根据 Origin 和 Host 两个字段判断是否是跨域请求。
3. 如果允许,则在 HTTP 头信息中添加 Access-Control-Allow-Origin
字段,并返回正确的结果
4. 如果不 允许,则不在 HTTP 头信息中添加 Access-Control-Allow-Origin
字段
用postman复现跨域问题
1. Postman 在请求Header上,并不会主动添加 Origin 字段,需要我们手动添加,如图:
2. postman不管是否跨域,返回的都是200结果,因此不能用是否返回值判断服务器是否允许跨域,而应该使用 response 的 Header 字段中是否存在允许跨域的字段来判断是否允许跨域。
相关字段包括:
Access-Control-Allow-Origin 是否允许该请求访问
Access-Control-Expose-Headers 可选,可以让用户拿到的字段。有几个字段无论设置与否都可以拿到的,包括:Cache-Control
、Content-Language
、Content-Type
、Expires
、Last-Modified
、Pragma
Access-Control-Allow-Credentials
: 可选,用户是否可以发送、处理 cookie