关于移动端html5的跨域问题

之前在开发pc上的html5就曾经遇到过跨域问题,这几天在做移动端html5的时候再次遇到了跨域的问题,于是下决心彻底把这个问题弄明白。本文主要对跨域问题进行说明,同时列出了移动端跨域问题的解决方案。


什么是跨域?

对于这个问题有一篇文章 《跨域的理解与实现》描述得很清楚,在这里摘录如下:

域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation)。信任关系是连接在域与域之间的桥梁。当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理。 有一种简明的说法来解释广域跨域:跨域访问,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,包括提交内容和获取内容。由于安全原因,跨域访问是被各大浏览器所默认禁止的。

在广域网环境中,由于浏览器的安全限制,网络连接的跨域访问时不被允许的,XmlHttpRequest也不例外。但有时候跨域访问资源是必需的。

同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。同源策略不阻止将动态脚本元素插入文档中。

由此我们可以知道,浏览器中不允许跨域访问,但是脚本元素是可以跨域访问的。

怎么算跨域?

在明确了跨域的概念之后,我们需要明白在什么情况下属于跨域。再摘录另一篇文章 《JavaScript跨域总结与解决办法》如下:

URL 说明 是否允许通信
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下 允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹 允许
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口 不允许
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同协议 不允许
http://www.a.com/a.js
http://70.32.92.74/b.js
域名和域名对应ip 不允许
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同 不允许
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/b.js
不同域名 不允许

跨域如何解决?

在这里我们主要探讨在移动端上的跨域问题,主要有以下两种解决办法:

1. JSONP
关于JSONP在这里不做过多说明,其原理主要就是通过前面所说的脚本元素来绕过浏览器的跨域限制,大家想了解的可以看看这篇文章 《说说JSON和JSONP》

2. 框架设置
在这里需要说明一个问题,其实在移动端的WebView并不存在跨域问题,因为WebView是通过file://协议来加载html文件的,而file://协议各个浏览器的实现标准不一样,有些浏览器如移动端的WebView、IE并没有限制对file协议的跨域访问。

但是我们在Android上使用PhoneGap+jQuery Mobile的时候仍然不能直接进行跨域访问,这是为什么呢?这其实是因为基于安全的考虑,PhoneGap和jQuery本身对跨域访问进行了限制,我们需要对它们进行一些配置。

在PhoneGap上,需要在项目的Configure文件中加入<access origin="*"/>,或者把*替换为所要访问的域名,这就允许了对该域名进行跨域访问。在jQuery上,我们需要在mobileInit函数中加上以下两行代码来允许跨域访问:
$.support.cors = true;
$.mobile.allowCrossDomainPages = true;

但是当我们需要在pc上对html5代码进行调试时应该怎么办呢?在这里以Chrome为例,可以关闭浏览器的跨域限制。在终端中通过以下命令启动Chrome浏览器即可:

Windows:
chrome.exe --disable-web-security

MacOS:
/usr/bin/open -a "/Applications/Google Chrome.app" --args --disable-web-security


如果大家觉得对自己有帮助的话,还希望能帮顶一下,谢谢:)
转载请注明出处,谢谢!
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值