Jsonp解决跨域1

作者: 喬喬养的泷大胖 | 来源:发表于2018-12-04 16:56 被阅读0次

    Jsonp解决跨域1



    1、jsonp如何解决跨域

    前后端都需要改动

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

    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代码如下

    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代码如下

    JSONPAdvice.java代码

    @ControllerAdvice

    public classJSONPAdvice extends AbstractJsonpResponseBodyAdvice {

        public JSONPAdvice(){

            super("callback");

        }

    }

    4、jsonp实现原理

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

    5、jsonp跨域联调

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

    相关文章

      网友评论

        本文标题:Jsonp解决跨域1

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