欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解SpringBoot多跨域请求的支持(JSONP)

程序员文章站 2024-03-01 09:49:16
在我们做项目的过程中,有可能会遇到跨域请求,所以需要我们自己组装支持跨域请求的jsonp数据,而在4.1版本以后的springmvc中,为我们提供了一个abstractjs...

在我们做项目的过程中,有可能会遇到跨域请求,所以需要我们自己组装支持跨域请求的jsonp数据,而在4.1版本以后的springmvc中,为我们提供了一个abstractjsonpresponsebodyadvice的类用来支持jsonp的数据(springboot接收解析web请求是依赖于springmvc实现的)。下面我们就看一下怎么用abstractjsonpresponsebodyadvice来支持跨域请求。

使用abstractjsonpresponsebodyadvice来支持跨域请求很简单,只需要继承这个类就可以了。具体代码如下:

package com.zkn.learnspringboot.config; 
 
import org.springframework.web.bind.annotation.controlleradvice; 
import org.springframework.web.servlet.mvc.method.annotation.abstractjsonpresponsebodyadvice; 
 
/** 
 * created by wb-zhangkenan on 2016/12/1. 
 */ 
@controlleradvice(basepackages = "com.zkn.learnspringboot.web.controller") 
public class jsonpadvice extends abstractjsonpresponsebodyadvice{ 
 
  public jsonpadvice() { 
 
    super("callback","jsonp"); 
  } 
} 

下面我们写个类来测试一下:

package com.zkn.learnspringboot.web.controller; 
 
import com.zkn.learnspringboot.domain.persondomain; 
import org.springframework.beans.factory.annotation.autowired; 
import org.springframework.http.mediatype; 
import org.springframework.web.bind.annotation.requestmapping; 
import org.springframework.web.bind.annotation.restcontroller; 
 
/** 
 * created by wb-zhangkenan on 2016/12/1. 
 */ 
@restcontroller 
@requestmapping("/jsonp") 
public class jsonptestcontroller { 
  @autowired 
  private persondomain persondomain; 
 
  @requestmapping(value = "/testjsonp",produces = mediatype.application_json_value) 
  public persondomain testjsonp(){ 
 
    return persondomain; 
  } 
} 

当我们发送请求为:http://localhost:8003/jsonp/testjsonp的时候,结果如下:

详解SpringBoot多跨域请求的支持(JSONP)

当我们发送的请求为:http://localhost:8003/jsonp/testjsonp?callback=callback的时候,结果如下所示:

详解SpringBoot多跨域请求的支持(JSONP)

看到区别了吗?当我们在请求参数中添加callback参数的时候,返回的数据就是jsonp的,当我们请求参数中不带callback的时候,返回的数据是json的。可以让我们方便的灵活运用。下面再奉上一个jsonp的完整案例。

前台页面:

<%@ page contenttype="text/html;charset=utf-8" language="java" %> 
<html> 
<head> 
  <title>title</title> 
  <script src="resources/js/jquery-2.1.4.min.js" type="text/javascript"></script> 
</head> 
<body> 
<input type="button" value="测试jsonp请求" onclick="testjsonp()" /> 
<script type="text/javascript"> 
  function testjsonp() { 
    $.ajax({ 
      type:'get', 
      url:'http://localhost:8003/jsonp/testjsonp', 
      datatype:'jsonp', 
      jsonp:"callback", 
      success:function (data) { 
        alert(data.username+" "+data.password); 
      }, 
      error:function (err) { 
        alert('出现错误了!!!'); 
      } 
    }); 
  } 
</script> 
</body> 
</html> 

后台代码1:

package com.zkn.learnspringmvc.news.controller; 
 
import org.springframework.stereotype.controller; 
import org.springframework.web.bind.annotation.requestmapping; 
 
/** 
 * created by zkn on 2016/12/3. 
 */ 
@controller 
public class jsonptestcontroller { 
 
  @requestmapping("testjsonp") 
  public string testjsonp(){ 
 
    return "jsonp"; 
  } 
} 

下面我们发送请求如下:http://localhost:8080/learnspringmvc/testjsonp

详解SpringBoot多跨域请求的支持(JSONP)

当我们点击测试jsopn请求这个按钮的时候,效果如下:

详解SpringBoot多跨域请求的支持(JSONP)

我们成功的实现了一个跨越的请求。更详细的请求信息如下:

详解SpringBoot多跨域请求的支持(JSONP)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。