今天,项目需要被别人集成,给一个账户,让他们去他们的系统ajax登录,发现登录的返回值没有弄到,细想是跨域的问题,如何解决?首先想用jsonp,试了一阵子,发现太难调了,直接用spring mvc的注解可以了,在spring mvc的配置文件中加入:
<!--跨域配置-->
<mvc:cors>
<mvc:mapping path="支持跨域的资源(/**任意)" allowed-origins="指定跨域的域名(*表示任意)" allow-credentials="true" max-age="1800" allowed-methods="表示支持跨域的请求方式(例如GET,POST)" />
</mvc:cors>
这样就搞定了。
这样的方式存在一个问题,那就是如果调用某一个接口,这种方式可以,如果进行不同系统之间的集成,这个种方式的问题就来了,因为这样的方式,会把那个接口返回请求的cookie也写到调用的那个域名下,如果你需要跳转到接口的那个域名,就会出现cookie没有的问题,这种情况对于不同系统的登录跳转中问题就来了,那就是session的丢失,因为之前的sessionId没有写到当前的域名,所以如果在跨域名登录问题就来了。这样的方式下,我们就只能用jsonp了。
简单说一下jsonp的使用吧。
$.ajax({
type : "post",
async:false,
url: url,
data: sendData,
//数据类型为jsonp
dataType:"jsonp",
//服务端用于接收callback调用的function名的参数
jsonp:"callback",
//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
jsonpCallback:"success_jsonpCallback",
//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
success : function(json){
处理
},
error:function(){
处理
}
});
这样就行了,如何让spring mvc 支持?
我们把跨域的接口json返回的修改如下:
例如:
@ResponseBody
public MappingJacksonValue test(,@RequestParam(name = "callback",defaultValue = "") String callback){
// obj对象用来存储返回值
JSONObject obj = new JSONObject();
例如
obj.put("test","test");
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(obj);
//参数为callback为回调函数的参数名 例如 jsonp:"callback",
if(StringUtils.hasText(callback)){
//这个设置回调函数 例如 jsonpCallback:"success_jsonpCallback"
mappingJacksonValue.setJsonpFunction(callback);
}
return MappingJacksonValue;
}
如果有回调函数,结果如下:
-
test: "test"
{
-
test: "test"
这样就好了。