一、什么是跨域
浏览器不能跨站点执行脚本。这是由于浏览器的同源策略造成的,同源:协议、域名、端口号均相同的站点才同源,任意一个不同都会产生跨域问题。注意,域仅仅是通过“URL的首部”来识别(“URL的首部”指window.location.protocol +window.location.host,也可以理解为“Domains, protocols and ports must match”。),浏览器不会尝试判断两个域是否在同一个ip上,即就算不同的域名对应的ip一样,也算跨域。例如http://localhost:8080与http://127.0.0.1:8080算跨域。同源限制主要分几种情况:
DOM同源:禁止对不同源的DOM进行操作。主要是针对iframe跨域场景,不同域的iframe父子页是不能操作对方的DOM的。(iframe的src属性时不存在跨域问题)
XMLHttpRequest同源(ajax):禁止使用XMLHttpRequest对象向不同源的服务器地址发起Http请求。
cookie,localstorage,无法读取
注意:跨域限制是浏览器行为,不是服务器行为。<a>、<img>、<script>等标签的src属性都不存在跨域限制
二、为什么浏览器要限制跨域
出于安全考虑
截图自:https://www.jianshu.com/p/a75cff5a67e2
三、如何解决跨域问题
1. CORS:”跨域资源共享”(Cross-origin resource sharing),这是一个W3C标准。
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于前端开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信
2. 服务器代理,即将先请求到本站点服务器,由服务器转发到跨域站点,再返回跨域站点返回的数据。(好麻烦额~~~)
3 JSONP,利用<script>标签的src属性不存在跨域实现,需要前后端同时配合,现已不推荐使用,方案一是标准的跨域方案,为什么不用呢,JSONP方案说到底还是捡漏洞。
其实如果我们只是简单地调用一下跨域的url,不需要交互,不需要url返回数据,那直接动态创建一个没有跨域限制的标签,例如<script src='跨域url'>,即可达到目的。但更多场景是我们需要获取url返回的数据,并操作该数据,这个时候JSONP应用而生(原理没变),后端返回的数据为方法的调用(例如方法名叫test),test(data),前端需要先定义test方法,这里我们定义弹出data的内容,function test(data) {alert(data)},这样就能实现了,最后将创建创建script标签,设置src的过程封装成一个函数,供跨域复用。
缺点:
仅支持get方法,由其原理决定(<script>的src走get请求)
不能解决iframe跨域
该方案需要前后端约定调用方法名。后端还需要知道前端方法名,是不是太耦合了
3.iframe跨域支持:可参考https://www.cnblogs.com/boystar/p/6909214.html。document.doamin、window.location.hash、window.name。
4、h5的postMessage。
四、其他
一个域名只能解析出一个ip,多个域名可以指向一个ip。(DNS域名解析负载均衡虽然可以配置一个域名映射多个ip,但是最终解析得到的还是一个ip)
问题:
将url换了后,再请求,能否解决跨域
参考:
https://www.jianshu.com/p/a75cff5a67e2
https://www.jianshu.com/p/a75cff5a67e2 总结可以看看