• jsonp跨域请求


    同源策略:

      Same-Origin Policy,是一个著名的安全策略,现在所有支持Javascript的浏览器都会使用这个策略;同源,就是ibxu由协议、域名、端口都一致的,才叫做同源

      eg:http://www.baidu.com和https://www.baidu.com,由于协议不一致,不是同源

      http://127.0.0.1:8080和http://localhost:8080,由于域名不一致,不是同源

      http://localhost:8080和http://localhost:8081,由于端口号不同,不是同源

      在浏览器中,<script>、<img>、<iframe>、<link>等标签都可以加载跨域资源,而不收同源限制,但浏览器限制了js的权限使其不能读、写加载的内容;另外同源策略只对网页的HTML文档做了现在,对加载的其他静态资源如js、css、图片等仍然认为属于同源

    跨域请求:

      1 Access-Control-Allow-Origin,是W3C为了解决同源策略而引起的跨域问题而提出的一种技术--"跨域资源共享",只要在服务端设置Access-Control-Allow-Origin的header就可以允许跨域访问了;但是有一个安全隐患:主要支持通配符*,每个网站都可以随意请求,不太安全

        response.setHeader("Access-Control-Allow-Origin", "*");  

       2 Query中的$.ajax的get方法,是支持跨域访问的,不过dataType要设定为"jsonp",jsonp(Json with Padding)是json的一种“使用模式”,可以让网页从别的域获取资料,jsonp是采用的js的回调机制来实现的

    $.ajax({   
      url: 'http://localhost:8080/getPicCode.action',    
      dataType: 'jsonp',     
      success: function (json) {  
        //客户端jquery预先定义好的callback函数,成功获取跨域服务器上的json数据后,会动态执行这个callback函数   
        alert(json);   
      },   
      error: function (){  
        alert("请求失败!");   
       }  
    });  
      
    //简单方式如下:  
    $.getJSON("http://localhost:8080/getPicCode.action?callback=?",  
    function(json){ // 执行代码  
    });  

      在服务端,重新拼接json数据,这样就可以在浏览器获取到异域服务器返回的json数据了,这里返回的跟json格式不一样,他返回的是回调函数名+(json数组)

        /** 获取请求的各个参数(用户名等) **/  
        Map map = request.getParameterMap();  
        /** 获取jsonp的回调函数名 **/  
        String callback = request.getParameter("callback");  
        /** 调用业务逻辑,并将结果转化为json格式 **/  
        String msg = convert2Json(services.login(map))  
        /** 重新拼接格式,并输出  **/  
        out.println(callback + "('" + msg + "')");  

    Jsonp工作原理:

      参考博客:http://blog.csdn.net/shimiso/article/details/21830313

      我们知道<script>标签可以加载跨域的javascript脚本,并且被加载的脚本和当前文档属于同一个域。因此在文档中可以调用/访问脚本中的数据和函数。如果javascript脚本中的数据是动态生成的,那么只要在文档中动态创建<script>标签就可以实现和服务端的数据交互。
          JSONP就是利用<script>标签的跨域能力实现跨域数据的访问,请求动态生成的JavaScript脚本同时带一个callback函数名作为参数。其中callback函数本地文档的JavaScript函数,服务器端动态生成的脚本会产生数据,并在代码中以产生的数据为参数调用callback函数。当这段脚本加载到本地文档时,callback函数就被调用

    Jsonp和Json的区别:

      什么是json:https://www.cnblogs.com/lijuntao/p/6902734.html

      最主要的区别:json返回一串数据,jsonp返回脚本代码(包含一个函数调用)

      json是理想的数据交换格式,但没办法跨域直接获取,于是就将json包裹(padding)在一个合法的js语句中作为js文件传过去。这就是json和jsonp的区别,json是想要的东西,jsonp是达到这个目的而普遍采用的一种方法,当然最终获得和处理的还是json。所以说json是目的,jsonp只是手段。json总会用到,而jsonp只有在跨域获取数据才会用到

  • 相关阅读:
    有关系统架构的高可用原则
    Redis面试篇 -- 如何保证缓存与数据库的双写一致性?
    Redis面试篇 -- Redis常见性能问题和解决方案?
    Redis面试篇 -- Redis主从复制原理
    Python3如何安装pip工具?
    Redis面试篇 -- Redis持久化的方式有哪些?优缺点分别是什么?
    Linux在丢失的情况下重置密码
    APC (Asynchronous Procedure Call)
    eigenface资料整合
    python+opencv模拟生成运动模糊核
  • 原文地址:https://www.cnblogs.com/roxy/p/7812888.html
Copyright © 2020-2023  润新知