美文网首页我爱编程
详解js跨域问题

详解js跨域问题

作者: 旅行家John | 来源:发表于2016-08-23 21:21 被阅读0次

    跨域失败

    当使用jsonp跨域时,

    1:请求必须是GET

    2:python 写的webservice返回的格式是JSONP格式,不是JSON格式。这里特别注意。

    命名自己写接口返回的接口是对的,但是一直报错

    在这篇文章上看到

    www.oschina.net/question/219762_142069


    在这里找到了解决方案

    json - JSONP web service with python - Stack Overflow

    python写的webservice是用flask框架写的,适合新手用。

    获取URL参数

    什么是跨域?

    概念:只要协议、域名、端口有任何一个不同,都被当作是不同的域。

    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 不同域名 不允许

    对于端口和协议的不同,只能通过后台来解决。

    通过jsonp跨域

    现在问题来了?什么是jsonp?维基百科的定义是:JSONP(JSON with Padding)是资料格式JSON的一种“使用模式”,可以让网页从别的网域要资料。

    JSONP也叫填充式JSON,是应用JSON的一种新方法,只不过是被包含在函数调用中的JSON,例如:

    callback({"name","trigkit4"});

    JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的JSON数据。

    在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的。但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的。 例如:

    functiondosomething(jsondata){//处理获得的json数据}

    js文件载入成功后会执行我们在url参数中指定的函数,并且会把我们需要的json数据作为参数传入。所以jsonp是需要服务器端的页面进行相应的配合的。

    最终,输出结果为:dosomething(['a','b','c']);

    如果你的页面使用jquery,那么通过它封装的方法就能很方便的来进行jsonp操作了。

    $.getJSON('http://example.com/data.php?callback=?,function(jsondata)'){//处理获得的json数据});

    jquery会自动生成一个全局函数来替换callback=?中的问号,之后获取到数据后又会自动销毁,实际上就是起一个临时代理函数的作用。$.getJSON方法会自动判断是否跨域,不跨域的话,就调用普通的ajax方法;跨域的话,则会以异步加载js文件的形式来调用jsonp的回调函数。

    JSONP的优缺点

    JSONP的优点是:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。

    JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。

    CORS和JSONP对比

    CORS与JSONP相比,无疑更为先进、方便和可靠。

    1、 JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求。

    2、 使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理。

    3、 JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS)。

    CORS能做什么:

    正常使用AJAX会需要正常考虑跨域问题,所以伟大的程序员们又折腾出了一系列跨域问题的解决方案,如JSONP、flash、ifame、xhr2等等。

    本文介绍的CORS就是一套AJAX跨域问题的解决方案。

    CORS的原理:

    CORS定义一种跨域访问的机制,可以让AJAX实现跨域访问。CORS 允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。

    CORS浏览器支持情况如下图:

    CORS启航

    假设我们页面或者应用已在http://www.test1.com上了,而我们打算从http://www.test2.com请求提取数据。一般情况下,如果我们直接使用 AJAX 来请求将会失败,浏览器也会返回“源不匹配”的错误,"跨域"也就以此由来。

    利用 CORS,http://www.test2.com只需添加一个标头,就可以允许来自http://www.test1.com的请求,下图是我在PHP中的 hander() 设置,“*”号表示允许任何域向我们的服务端提交请求


    也可以设置指定的域名,如域名http://www.test2.com,那么就允许来自这个域名的请求

    当前我设置的header为“*”,任意一个请求过来之后服务端我们都可以进行处理&响应,那么在调试工具中可以看到其头信息设置,其中见红框中有一项信息是“Access-Control-Allow-Origin:*”,表示我们已经启用CORS,如下图。

    PS:由于demo都在我厂的两台测试机间完成,外网也不能访问,所以在这就不提供demo了,见谅

    简单的一个header设置,一个支持跨域&POST请求的server就完成了:)

    当然,如果没有开启CORS必定失败的啦,如下图:

    相关文章

      网友评论

        本文标题:详解js跨域问题

        本文链接:https://www.haomeiwen.com/subject/tzensttx.html