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只有在跨域获取数据才会用到

原文地址:https://www.cnblogs.com/roxy/p/7812888.html