1.跨域是什么鬼?
前台调用后台的接口,如果不是同一个域,就会产生跨域问题
2.为什么会产生跨域问题?
1. 浏览器限制
浏览器出于安全考虑,发现请求是跨域的时候,会做一些校验,校验不通过,就会有跨域问题
2. 发出的请求不是本域的
发出的请求,不是本域的,协议,域名,端口,任何一个不一样,浏览器都会认为是跨域
3. 发出的是XHR(XMLHttpRequest)请求
如果发出的不是XHR请求,即使不是本域的,浏览器不会认为是跨域
3.如何解决跨域问题?
1.让浏览器不做校验
命令行参数启动:通过命令行参数启动浏览器(--disable-web-security), 浏览器不会检查
MacOS命令行:
open -n /Applications/Google Chrome.app/ --args --disable-web-security —user-data-dir=/Users/你电脑的名字/MyChromeDevUserData/
2.jsonp本身
jsonp是用动态创建的script标签对进行请求 /get?callback=123
为什么jsonp可以解决跨域问题?
发出的请求不是xhr类型,type是script类型,浏览器不做校验
callback的内容,就是函数名,返回的数据,是作为函数的参数
jsonp的缺点:
-服务器需要改动代码
-只支持get方法
-发送的不是xhr请求
3.跨域本身
跨域资源共享CORS:在响应头增加指定的字段,允许对方调用
Access-Control-Allow-Origin
"*" 允许所有域跨域调用
"http://www.sanjieke.cn" 允许这个域跨域调用
Access-Control-Allow-Method
"*" 允许所有的方法
"GET" 指定允许的方法
带cookie的跨域,origin必须是全匹配,不能是*号,需要增加Access-Control-Allow-Credentials为true,前端也需要设置xhr.withCredentials = true 带上cookie
带自定义头的跨域,增加Access-Control-Allow-Headers,值为自定义头