天天看点

Jsonp解决跨域1Jsonp解决跨域1

Jsonp解决跨域1

1、jsonp如何解决跨域

前后端都需要改动

(1)前端:index.html代码如下:

Jsonp解决跨域1Jsonp解决跨域1

index.html代码

describe("A

suite is just a function-ajax跨越完全讲解", function() {

// 测试方法

                     it("jsonp请求", function(done) {

                            //服务器返回的结果

                            var result;

                            $.ajax({

                                   url: base+"/get1",

                                   dataType:"jsonp",

                                   jsonp:"callback",

                                   cache:true,

                                   success:function(json){

                                          result= json;

                                   }

                            });

                            //由于是异步请求,需要使用setTimeout来校验

                            setTimeout(function(){

                                   expect(result).toEqual({

                                          "data": "get1 OK"

                                   });

                                   //校验完成,通知jasmine框架

                                   done();

                            }, 100);

                     });

              });

(2)后端:JSONPAdvice.java代码如下

Jsonp解决跨域1Jsonp解决跨域1

JSONPAdvice.java代码

@ControllerAdvice

public classJSONPAdvice extends AbstractJsonpResponseBodyAdvice {

    public JSONPAdvice(){

        super("callback");

    }

}

2、jsonp是什么?

    JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

    上面百度百科的没有理解没关系,我搞了一段民间解释,或许对你有帮助:

    先说说JSONP是怎么产生的:

    其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,着用自己的方式来阐释一下这个问题,看看是否有帮助。

(1)一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面、动态网页、web服务、WCF,只要是跨域请求,一律不准。

(2)不过我们又发现,Web页面上调用js文件时则不受是否跨域的影响(不仅如此,我们还发现凡是拥有”src”这个属性的标签都拥有跨域的能力,比如<\script>、<\img>、<\iframe>)。

(3)于是可以判断,当前阶段如果想通过纯web端(ActiveX控件、服务端代理、属于未来的HTML5之Websocket等方式不算)跨域访问数据就只有一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理。

(4)恰巧我们已经知道有一种叫做JSON的纯字符数据格式可以简洁的描述复杂数据,更妙的是JSON还被js原生支持,所以在客户端几乎可以随心所欲的处理这种格式的数据。

(5)这样子解决方案就呼之欲出了,web客户端通过与调用脚本一模一样的方式,来调用跨域服务器上动态生成的js格式文件(一般以JSON为后缀),显而易见,服务器之所以要动态生成JSON文件,目的就在于把客户端需要的数据装入进去。

(6)客户端在对JSON文件调用成功之后,也就获得了自己所需的数据,剩下的就是按照自己需求进行处理和展现了,这种获取远程数据的方式看起来非常像AJAX,但其实并不一样。

(7)为了便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

如果对于callback参数如何使用还有些模糊的话,我们后面会有具体的实例来讲解。

3、使用jsonp后端需要改动?

使用jsonp后端是需要改动的

通过spring AOP原理编写代码(advice)

后端:JSONPAdvice.java代码如下

Jsonp解决跨域1Jsonp解决跨域1

JSONPAdvice.java代码

@ControllerAdvice

public classJSONPAdvice extends AbstractJsonpResponseBodyAdvice {

    public JSONPAdvice(){

        super("callback");

    }

}

4、jsonp实现原理

    Ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,在src中进行了调用,这样实现了跨域。

5、jsonp跨域联调

Jsonp解决跨域1Jsonp解决跨域1

jsonp联调成功:解决了跨域问题  

继续阅读