前言: 跨域请求是前台开发中经常遇到的场景,但是由于浏览器同源策略,导致A域下普通的http请求没法加载B域下的数据,跨域问题由此产生。但是通过script标签的方式却可以加载非同域下的js,因此可以利用这一特性,进行跨域数据请求。

先看一下跨域导致的问题,测试域分别为 localhost 和 www.icity366.com, 下文分别对应A域和B域,测试文件为A域下的 data.jsp, 我们在A(localhost)域下请求B(www.icity366.com)域下的数据,看一下data.jsp中关键代码:

    $.ajax({
url : "http://www.icity366.com:8080/addresslist/test/Data.do?method=getData",
data : {callback : "getData"},
//dataType : "json",
type : "get",
success : function(data){
alert(data);
},
error : function(XmlHttpRequest,textStatus,errorThrown){
//debugger;
alert(textStatus);
}
  })

 结果为alert("error"),浏览器提示跨域:

  

利用script标签解决跨域

在data.jsp页面中定义好回调方法,

function getData(data){
  alert(data.name);
}

通过script标签引用js:

<script type="text/javascript" src="http://www.icity366.com:8080/addresslist/test/Data.do?method=getData&callback=getData"></script>

服务器端java代码如下:

String callback = request.getParameter("callback");
Map<String,String> data = new HashMap<String,String>();
data.put("name", "Liyx");
data.put("age", "25");
String dataJson = JsonUtils.convertToString(data);//Map->json
response.getWriter().write(callback+"("+dataJson+")");

 请求结果:

java端返回  getData({"age":"25","name":"Liyx"}),页面执行getData(),弹出 Liyx, 说明<script>标签可跨域获得数据。

 JSONP方式跨域写法

  json核心就是:允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。先看一下写法:

var url = "http://www.icity366.com:8080/addresslist/test/Data.do?method=getData&callback=?";
$.getJSON(url,function(data){
alert(data.name);  //Liyx
})

  callback=? 先传递?过去,jquery会自动生成一个全局函数来替换callback=?中的问号,看一下java端的输出,

jQuery171004718876606784761_1411549835461({"age":"25","name":"Liyx"}),长串即为生成的全局函数,该function会自动销毁,并把数据传递到回调方法中。

最新文章

  1. Swift3.0P1 语法指南——构造器
  2. iOS---后台运行机制详解
  3. C++ 定义全局数组
  4. Unity中Instantiate一个prefab时需要注意的问题
  5. 自定义UISearchBar
  6. NIO基础
  7. 【Oracle】ORA-06550 PLS-00201
  8. 其他主机连接本地主机Tomcat会出现的防火墙问题
  9. 一键搭键php网站环境的系统
  10. 剖析Vue原理&amp;实现双向绑定MVVM
  11. zabbix3.2自动发现批量监控redis端口状态
  12. 存储专栏:一句话说清RAID2.0
  13. python读写修改配置文件(ini)
  14. 在Vue中的load或ready的加载时机
  15. jsonp 跨域 jsonp 发音
  16. SpringMVC之声明式校验
  17. HDU - 6231 K-th Number (2017CCPC哈尔滨站 二分+尺取法)
  18. Codeforces 660C - Hard Process - [二分+DP]
  19. 成对使用new和delete,传值传引用
  20. OpenGL学习--05--纹理立方体--代码

热门文章

  1. android studio SDK版本的调节
  2. FOJ 1962 新击鼓传花游戏 线段树
  3. 基于MFC和opencv的FFT
  4. 【九度OJ】题目1096-二分查找
  5. Multiple reportviewers on one page With reportviwer 11.0
  6. linux网络编程笔记——UDP
  7. SSH与SSL
  8. Linux下文件的压缩与打包
  9. Cognos 增加全局类
  10. eclipse中如何设置tomcat启动时间