切换主题
跨域资源共享 CORS(Cross-origin resource sharing)
字数
447 字
阅读时间
2 分钟
CORS就是,允许浏览器向跨源服务器,发送XMLHttpRequest请求,并获取请求返回内容
支持
CORS需要浏览器和服务器同时支持。 目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
OPTIONS 预请求
检测 —— 客户端发出的请求是否被服务端允许
当客户端发送跨域请求时,浏览器会自发地先发送一个Method为OPTIONS的请求 请求和你发送请求的URL一致,且不带任何参数 OPTIONS请求通过,则发送真正的请求,否则将不再发送真正请求
跨域配置
基本功能配置
客户端无需配置
服务端配置
java
String origin = request.getHeader("Origin"); //获取请求源
response.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); //允许上述Method的跨域请求
response.setHeader("Access-Control-Allow-Origin", origin); //允许当前源的跨域请求
Cookie和TLS客户端证书配置
跨域请求默认不发送Cookie以及TLS客户端证书信息,需要手动配置
客户端配置
javascript
xhr.withCredentials = true
服务端配置
java
response.setHeader("Access-Control-Allow-Credentials", "true");
Tips
- OPTIONS请求不会发送Cookie
- 跨域请求发送的Cookie为请求域下的Cookie
问题解决
登录权限判断
异步请求有时会需要根据Cookie来判断是否登录,而options请求是不发送cookie的。 这时,就需要服务端仅针对options请求不做cookie校验。 服务端可以通过下面两点来进行判断 1、method == options 2、Access-Control-Allow-Headers == X-Requested-With (判断是ajax,需要客户端添加)