关于 HTML5、Jquery、Phonegap 跨域问题的研究

近期研究Phonegap的相关技术,遇到了服务资源访问的跨域。经过尝试使用服务器端的代理,Phonegap打包后不能够访问到相应资源。在搜索引擎的帮助下,找到了Jquery的jsonp的方式,尝试发现已有的服务资源返回格式不支持。接着转战CORS发现同样需要服务器端配置,几番折腾,后来发现Phonegap原来就不存在跨域访问的问题。于是乎,使用JqueryMobile的ajax测试,打包安装应用,原来真的可以访问。虽然比较曲折,但是也算对js的相关跨域有了一定的认识,在此总结纪录,以供有同样需求的同学享用!

A、关于跨域

其实跨域访问在日常的web项目开发是及其常见的问题。跨域问题的原因是浏览器的同源策略(same origin policy),它是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript 的浏览器都会使用这个策略。

简单讲,同源就是要求域名,协议,端口三者都一致,而同源策略就是指页面上的脚本不能访问非同源的资源。

B、Phonegap与跨域

其实,谈跨域是不应该把Phonegap拉进来的,对于Phonegap本身人家是没有限制的,只需要简单配置即可。因为Phonegap使用的是 file:// 协议(Phonegap wiki里面说: ”The cross-domain security policy does not affect PhoneGap applications. Since the html files are called by webkit with the file:// protocol, the security policy does not apply.”)

但是默认的配置需要检查

b1.Jquery项目里面的相关配置:

$.support.cors=true;

$.mobile.allowCrossDomainPages=true;

b2.Phonegap配置设置:

phongegap2.9.1(cordova/defaults.xml)

找到<access origin="*"/>可以在此处设置需要跨域的域名列表

具体参考官网

http://docs.phonegap.com/en/3.0.0/guide_appdev_whitelist_index.md.html

C、Jquery与跨域

对于Jquery跨域访问,jsonp是不错的选择。JSONP(JSON with Padding)是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料。但是需要注意服务器端返回数据的格式。对于访问已有的服务器数据不满足jsonp时,应该是不可用的。

与一般的ajax访问不同的是需要设置dataType="jsonp",注意服务器端返回数据格式。

D、HTML5与跨域

与HTML5关系密切的跨域技术规范叫跨来源资源共享(CORS)是一份浏览器技术的规范,提供了 Web 服务从不同网域传来沙盒脚本的方法,以避开浏览器的同源策略[1],是 JSONP模式的现代版。与 JSONP 不同,CORS 除了 GET 要求方法以外也支援其他的 HTTP 要求。用 CORS 可以让网页设计师用一般的XMLHttpRequest,这种方式的错误处理比 JSONP 要来的好。另一方面,JSONP 可以在不支援 CORS 的老旧浏览器上运作。

值得注意的是同样CORS需要在服务器端配置,也就是说服务器端可以控制访问服务的域名来源,当然,对于没有配置的资源,貌似还是不能访问。

[html] view plaincopy

  1. header("Access-Control-Allow-Origin:*");

实现思路:

[html] view plaincopy

  1. function createCORSRequest(method, url) {
  2. var xhr = new XMLHttpRequest();
  3. if ("withCredentials" in xhr) {
  4. xhr.open(method, url, true);
  5. } else if ( typeof (xhr) != "undefined") {
  6. xhr = new XDomainRequest();
  7. xhr.open(method, url, true);
  8. } else {
  9. // 否则,浏览器不支持CORS
  10. xhr = null;
  11. }
  12. return xhr;
  13. }
  14. function abc() {
  15. var url = "http://st.geoq.cn/geocode/xxx/single?queryStr=%E5%8C%97%E4%BA%AC%E4%B8%9C%E7%9B%B4%E9%97%A8%E5%8D%97%E5%A4%A7%E8%A1%97&citycode=110000&f=json";
  16. var xhr = createCORSRequest(‘GET‘, url);
  17. if (!xhr) {
  18. alert(‘CORS not supported‘);
  19. } else {
  20. xhr.send();
  21. }
  22. }

应为服务器端没有配置导致不可以跨域访问的提示:

E.服务器端代理

这种形式在之前的Flex跨域中也经常使用,Esri也提供了不同服务器的代理页面。但是,问题是它需要对应用进行部署访问。

F.总结

跨域问题是web开发中的普遍问题,同时也是考验前端工程师耐心和能力的试金石。本文就近期研究Phonegap开发中遇到的跨越问题在此总结,与大家分享!

时间: 2024-10-13 22:03:50

关于 HTML5、Jquery、Phonegap 跨域问题的研究的相关文章

关于HTML5、Jquery、Phonegap跨域问题的研究

我的问题: 近期研究Phonegap的相关技术,遇到了服务资源访问的跨域.经过尝试使用服务器端的代理,Phonegap打包后不能够访问到相应资源.在搜索引擎的帮助下,找到了Jquery的jsonp的方式,尝试发现已有的服务资源返回格式不支持.接着转战CORS发现同样需要服务器端配置,几番折腾,后来发现Phonegap原来就不存在跨域访问的问题.于是乎,使用JqueryMobile的ajax测试,打包安装应用,原来真的可以访问.虽然比较曲折,但是也算对js的相关跨域有了一定的认识,在此总结纪录,以

【学亮IT手记】Ajax跨域问题精讲--jQuery解决跨域操作

什么是跨域 跨域,它是不同的域名(服务器)之间的相互的资源之间的访问. 当协议,域名,端口号任意一个不同,它们就是不同的域. 正常情况下,因为浏览器安全的问题,不同域之间的资源是不可以访问的. 跨域的解决方案 什么情况下会用到跨域? 一般情况,是在自己的内部的工程中会出现跨域的情况. 有三种解决方案: 1.服务器跨域(代理方案) 2.jsonp,<script>标签的开发策略. 3.XHR2,HTML5提供,一般是在移动开发中使用. jQuery解决跨域操作 在jquery中可以使用$.aja

[jQuery]$.get跨域提交不发送原因

使用 $.ajax({ url: "http://pastebin.com/embed_js.php?i=sy9gt3FR", dataType: "jsonp", success: function (data) { // ... } }); [jQuery]$.get跨域提交不发送原因,布布扣,bubuko.com

html5 postMessage解决跨域、跨窗口消息传递

问题: 对于跨域问题,研究了一下html5的postMessage,写了代码测试了一下,感觉html5新功能就是好用啊. 此文仅使用html5的新特性postMessage,演示其执行过程和效果: 方法解释:postMessage()方法允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本档.多窗口.跨域消息传递.postMessage(data,origin)方法接受两个参数: 1.data:你需要传递的消息,消息传递的格式有一定要求:参数可以是JavaScript的任意基本类型或可

jquery Jsonp 跨域访问

$(function () { $.ajax({ url: 'http://ihisuns.vicp.cc:8765/PcClient.aspx', data: { "ModuleName": "MiXinDialogue", "MethodName": "GetMiXinDialogue", "Id": "1" }, dataType: "jsonp", jsonp

Jquery Ajax 跨域调用asmx类型 WebService范例

摘要:Ajax 在 Web 2.0 时代起着非常重要的作用,然而有时因为同源策略(SOP)(俗称:跨域问题(cross domain)) 它的作用会受到限制.在本文中,将学习如何克服合作限制.本文以asmx方式搭建webservice作为测试用后端,给出完整的前后端调用解决方案.范例代码. 关键词: jquery ajax 跨域  webservice  asmx  cross-domain 0 问题分析 0.1 什么是跨域问题? 越来越多的网站需要相互协作.例如,在线房屋租赁网站需要谷歌地图的

使用jquery实现跨域请求数据

首先处理服务器代码,使返回的数据符合特定的格式,为了方便这里使用了php test.php代码如下 1 <?php 2 $con = mysql_connect("localhost","root","root"); 3 mysql_select_db("test", $con); 4 5 $result = mysql_query("select username,password from user&quo

jquery ajax跨域请求webservice webconfig配置

jquery ajax跨域请求webservice web.config配置 <configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> <webServices> <protocols> <add name="HttpGet"/> <add name="Htt

[HTML5_Web Workers+Sockets]HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦

前言 HTML5新增通信相关两个API,跨文档消息传输与WEB Sockets API, 跨文档消息传输功能,可以在不同网页文档,不同端口(跨域情况下)进行消息传递. 使用web sockets api 可以让客户端与服务器端通过socket端口传递数据,这样便可以使用数据推送技术. 跨文档消息传输 在之前我们若想跨域获取信息会花很多功夫,现在只要获取网页所在窗口对象实例变可以实现互相通信. 首先要想从其他窗口接受发过来的消息需要对其窗口对象进行监听: window.addevntListene