因为在同一个浏览器窗口中能够同时打开多个网站的页面,而且它们都处于同一个会话中,如果不禁止跨域访问则会造成用户隐私数据泄露和登录身份冒用的问题,所以浏览器会使用同源策略限制跨域访问。
在浏览器中,通过JS代码访问不同域名下的URL或者iframe时,会被禁止访问。而不是通过JS代码进行的跨域访问不存在跨域问题!比如跨域加载图片,引用JS文件,下载各种文件,使用iframe跨域嵌入其他网站的页面都是可以的。
跨域访问被禁止有时会给应用开发带来阻碍,但在符合特定条件时也有相应的方法在保证安全的情况下能够解决跨域访问问题:
1 在对方服务器的响应头中添加Access-Control-Allow-Origin允许哪些域进行跨域访问,它的指可以是域名或者*。(这种方案只有在对方信任、不在乎、安全的情况下才能使用。)
2 如果域名都是同一个根域名的子域名,则可以使用document.domain="根域名"来统一JS执行环境的域名。(这种方案只能在同一个公司和组织的内部使用)
3 使用JSONP(JSON Padding)。浏览器不限制通过script标签引入其他网站的脚本,所以可以通过JS向页面动态添加一个script标签并指定其src为一个特殊的url,对方的服务器针对这个url的请求,会进行特殊的处理。
4 将要请求的URL发送给自己的服务端,让服务端发起请求(服务端没有跨域限制),服务端请求成功后,将数据再传给浏览中的JS(这种方式叫做服务端代理请求,这种方式只要自己的服务端支持一下就ok了,是比较常用的方案,没有任何限制)。
5 使用任何可以利用的浏览器端中间机制实现跨域交换数据。