springmvc跨域

//mvc默认是text/plain;charset=ISO-8859-1
@RequestMapping(value = "/xxx", produces = "application/json;charset=UTF-8")
@ResponseBody
public xxx xxx() {return xxx;}

使用jackson:
返回java对象,springmvc会自动调用jackson,将java对象转换成json格式字符串

使用json-lib:
可以将java对象转化为json格式字符串,然后直接返回字符串
不能直接转list等集合,可以将list加到map中,再转map
JSONObject jsonObjectFromMap = JSONObject.fromObject(map);
String jsonStr = jsonObjectFromMap.toString();

跨域:
跨域要在后端增加参数String jsonpCallback,
并将jsonpCallback拼接到返回的json格式字符串中,
String jsonStr = jsonpCallback + "(" + jsonStr + ")";
页面则要设置为:
dataType: 'jsonp',
jsonp: "jsonpCallback",//jsonp的值默认为callback
jsonpCallback:"myJsonpCallback",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
//jsonpCallback=myJsonpCallback将作为参数传给后端,后端获取参数jsonpCallback,并将jsonpCallback参数的值myJsonpCallback作为调用的函数名
//jsonp使用默认值callback,则jsonp和jsonpCallback都可省略

跨域原理:


1.跨域的障碍:
同源策略:基于安全的原因,浏览器使用同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性。
简单点说,就是浏览器限制脚本只能和同协议、同域名、同端口的脚本进行交互。


2.绕开障碍:
<script>、<img>、<iframe>等标签拥有跨域的能力,
JSONP就是利用<script>标签绕过浏览器的同源策略,
JSONP是英文JSON with Padding的缩写,是一个非正式传输协,允许服务端生成<script>标签返回给客户端。
返回的<script>标签中就是一个远程js文件,内容是调用本地的一个函数,并将要传输的数据作为该函数的参数


3.分析例子:

$.ajax({
    type: "get",
    url: "xxx",
    dataType: "jsonp",
    jsonp: "jsonpCallback",
    jsonpCallback:"myJsonpCallback",
    success: function(json){
        alert(json);
    }
});
public String findNearby(String jsonpCallback) {
    String json = "{name:'xiaoming'}";
    json = jsonpCallback+"("+json+")";//返回的最终字符串为"myJsonpCallback({name:'xiaoming'})"
    return json;
}

//这里实际是调用myJsonpCallback函数,并将{name:'xiaoming'}作为参数
//jquery会将success函数封装成myJsonpCallback函数,实际上调用的就是success函数,而参数就是后台的json格式数据
//这样就能在success函数中处理后台传输的数据了


参考:http://www.cnblogs.com/dowinning/archive/2012/04/19/json-jsonp-jquery.html

原文地址:https://www.cnblogs.com/guodefu909/p/5438370.html