• Ajax请求利用jsonp实现跨域


    跨域: js有一个同源限制,简单说来源不一样的话就无法相互间交互.那么怎么算来源不一样呢, 举个例子:浏览器访问-->服务器A--->得到页面A---页面A中的js脚本只能访问服务器A的资源(相同域名和端口,此外域名与对应的ip也算不同源,要么都域名,要么都ip).

    以上就是js的跨域问题,但是这里需要注意一点的是服务器A是没有跨域的问题的,这个只有js存在这个问题,也就是说: 页面A中js-->服务器A--->跨域资源,这个路径是可以.只有 页面A中的js--->跨域资源,这个路径是不行的.

    然后说一下解决方案中的jsonp,这个不是一种格式,而是一种解决方案.

    jsonp的原理:js虽然有同源限制,但是引入js文件的时候却没有这个限制,也就是说:

    <script type="text/javascript" src="xxx/xxxx.js"></script>

    其中src属性引入js文件的时候是没有同源限制的,此时是可以引入域外资源的.jsonp的原理就在这里,通过动态的创建一个以上那行js引入语句,通过其src属性访问域外资源.而域外资源服务器只要返回一个能被解析为js语句的字符串即可达到返回结果的目的,形如:

    callback({"key":"value",...})  

    其中callback是需要事先约定的名字,绿字部分为要返回的json字符串,然后拼接成以上那种形式直接返回即可.这样页面中的js从服务端接收到这个拼接的字符串后,就会直接执行本地的名为callback的js方法,这也就是为何callback这个需要事先约定的原因,需要保证页面侧要存在这个js方法,这个方法传入的参数就为服务器侧的返回值.

    ajax是支持jsonp的,所以以上那些麻烦事情都会替我们做,写法如下:

    $.ajax({
              type: 'GET',
              url: "http://127.0.0.1:8080/xxx/xxx",
              async: false,
              dataType: "jsonp",
              jsonp: "callback",
              success: function(result){
                  .....
              },
              timeout:3000  
        });

    红字部分标识我们使用jsonp的方式调用,实际上此时这个已经不是传统意义上的ajax的get请求了,它的真实实现方式就是我们上文中说的那样.其中红字部分的callback为我们要和服务器端进行沟通的部分,这个请求发送到服务器端,实际上这样的:

    http://127.0.0.1:8080/xxx/xxx?callback=jqueryxxxx

    服务器端需要通过callback来取值(类似用request.getParameter("callback")),也就是取后面的jqueryxxxx等自动生成的值,这个值实际上就是对应的我们发送请求的ajax方法中的success回调方法,服务器端如果返回

    jqueryxxxx({"ret":"ok"})

    页面中会自动执行success方法,且将{"ret":"ok"}传给success方法的参数result.

    以上就是ajax通过jsonp的方式实现跨域访问的过程.可以看出基本不用我们做什么额外操作,全都封装好了.

  • 相关阅读:
    JS中的逻辑或||逻辑与&&
    for 循环里面事件函数的i值
    getByClass--js
    ul 宽度不固定居中
    style.top style.left js
    trigger() 触发事件
    JavaScript中hasOwnProperty函数
    使用windows powershell ISE管理命令窗口,并集成git命令
    nodeJs跨域设置(express,koa2,eggJs)
    node获取本机动态IP,并对应修改相关JavaScript文件的IP地址
  • 原文地址:https://www.cnblogs.com/chyu/p/5005323.html
Copyright © 2020-2023  润新知