这里写目录标题
- 一、什么是跨域:
- 二、跨域问题解决思路:
- 1.从浏览器入手
- 2.从域名入手
- 3.从jsonp入手
- 4.从代理入手
一、什么是跨域:
跨域指的是不同服务器之间不能相互访问各自的资源或者数据,这出于一个策略——“同源策略”,那么为什么要这么设计呢,这是因为,一些网站的数据可能涉及的用户的隐私,因此不属于当前服务器的网站是不能访问它的,就比如,我们登陆淘宝后,由不小心点进了其他的一个钓鱼网站,如果说不这么设置,那么钓鱼网站就可以获取到你的登陆账号和密码,进而可以达到使用你的账户购买东西的目的,因此跨域是出于安全的考虑而诞生的。
- 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
二、跨域问题解决思路:
1.从浏览器入手
其实跨域只在浏览器下才会触发,那有没有办法禁用浏览器的同源策略呢?办法还真的有。
对于IE浏览器:进入ie的网际网路选项设置,然后选择安全性,再选择自订等级,然后下拉,找到「存取跨网络的资料来源」,选择启用即可;
对于chrome浏览器:通过在命令行,输入chrome.exe --allow-file-access-from-files --user-data-dir=“C:/Chrome dev session” --disable-web-security,这会新建一个浏览器实例,自动打开的chrome会显示一系列黄色的文字就说明成功了;
对于FireFox浏览器:在地址栏输入about:config,然后下拉找到security.fileuri.strict_origin_policy,然后设置为false即可
2.从域名入手
既然域名等信息不一致导致跨域产生,那么干脆就把两个项目合并成一个项目,使用相同的协议、域名和端口。
3.从jsonp入手
其实认真想想,我们的系统中经常会用到外链的图片、样式文件以及插件,那这些不会导致跨域吗?是的,真的不会,因为这些是http请求,并不是前面定义的xhr(XmlHttpRequest)请求。
既然图片和js脚本可以正常请求,那么如果把script脚本的src改成我需要跨域请求的url是不是就可以了呢?
是可以的,当请求接口返回的数据需要稍微处理下。在平常引入script脚本时,下载完文件后自动执行,如果我们把src改成跨域url,而且返回值是一段jjs语句,比如:
req.send(“alert(1)”); //后台返回js语句那么前台会会自动解析并执行。
4.从代理入手
还是回到最开始,既然浏览器认为非同源不安全,那么向同源请求不就行了?我们把请求转到同一项目下的后台,在同项目的后台进行xhr请求,然后把请求结果原样返回给前台,这就是代理(或者叫转发)。
成功的原因是同源策略只在浏览器下才起作用,我用后台来请求其他的url,那是不受影响的。开启后台代理可以用C#、JAVA、NodeJs、甚至是python都行,只要能被前端访问的并且能转发请求就可以。