为了保证用户信息的安全,所有的浏览器都遵循同源策略。
记住:协议、域名、端口号完全相同时,才是同源
跨域不是无法请求,是请求到的数据能否被浏览器返回,即response
cors进行跨域又分为简单请求和非简单请求两种情况:
简单请求
何为简单请求,满足以下条件:
1、使用下列 HTTP 方法之一
-
GET
-
HEAD
-
POST,并且Content-Type的值在下列之一:
-
text/plain
-
multipart/form-data
-
application/x-www-form-urlencoded
-
2、并且请求头中只有下面这些(个人理解是请求头中没有自定义字段,如某些场景下需要额外传递自定义token字段)
-
Accept
-
Accept-Language
-
Content-Language
-
Content-Type (需要注意额外的限制)
-
DPR
-
Downlink
-
Save-Data
-
Viewport-Width
-
Width
解决方法:服务端设置Access-Control-Allow-Origin: *货Access-Control-Allow-Origin: 特定origin(可以多个)
非简单请求
需要发送options预检请求,即查询服务端是否允许跨域,options请求成功则继续进行第二次请求,options请求失败则不会进行第二次请求。特别的服务端不进行特殊处理,则options请求也会返回数据,存在资源浪费,服务端可以进行过滤,预检请求只进行校验不返回具体数据。
options请求中,浏览器会自动在请求中加入以下字段向服务端校验是否允许跨域
-
Access-Control-Request-Headers: 自定义请求头字段*
-
Access-Control-Request-Method: 请求方法
同时,服务端需要设置以下内容:
resp.setHeader("Access-Control-Allow-Origin", "orgin*");
resp.setHeader("Access-Control-Allow-Headers", "字段名");
cookie跨域问题
浏览器向不同域发送请求时不会携带cookie,需要客户端和服务器同时设置
如果要让浏览器发送 cookie,需要在 Client 设置 XMLHttpRequest 的 withCredentials 属性为 true。服务端设置resp.setHeader("Access-Control-Allow-Credentials","true");