spring mvc 跨域

来源:互联网 发布:mac dock 顺序 编辑:程序博客网 时间:2024/06/05 14:27

          今天,项目需要被别人集成,给一个账户,让他们去他们的系统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;
}

如果有回调函数,结果如下:

/**/callbackname(
{
  • test"test"
}
)
如果没有回调,结果如下:

{

  • test"test"
}

这样就好了。