spring中使用jsonp来解决跨域请求问题

1、介绍
参考博客:

https://blog.csdn.net/qq_35249342/article/details/82919604?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.edu_weight

  跨域请求指的是:当前发起请求的域和该请求指向的资源所在的域不一致。这里的域指的是协议,域名和端口号的合集,同域就是协议,域名和端口号均相同,任何一个不同就是跨域。
跨域请求说明:


  我们可以使用JSONP(json with padding)的方式来解决跨越请求,这是因为JS能够跨域请求JS,然后将请求的JS和请求的数据封装后返回到前端,然后前端进行解析后即可获取跨域请求的数据。
在请求头中加入callback参数,例如下面的地址:

http://localhost:8080/xx?callback=xxx

然后,后台在获取到前端的请求后,然后判断请求路径中是否包含callback参数,如果有,就将数据包含callback返回;反之,按照默认格式返回。

2、测试
(1)导入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <!--监控-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>
 <!--使用官方的org.json时会报错-->
 <!--        <dependency>-->
<!--            <groupId>org.json</groupId>-->
<!--            <artifactId>json</artifactId>-->
<!--            <version>20180130</version>-->
<!--        </dependency>-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.39</version>
        </dependency>

(2)业务类-controller

@Controller
public class Y6ItemController {

	//设置返回JSON数据的字符编码
	@RequestMapping(value = "/MappingJacksonValueTest" ,produces = MediaType.APPLICATION_JSON_VALUE+";charset=utf-8")
	@ResponseBody
	public Object MappingJacksonValueTest(String callback){

		JSONObject jsonObject = new JSONObject(); //返回json对象
		//需要返回的数据
		jsonObject.put("data","tagDatas");
		//callback 这个是js调用时传过来的参数,内容就是回调的方法名
		//使用Spring自带对象,前提是需要在Srping4.0以上的版本才有的哟。
		//返回 Object
		MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(jsonObject);
		mappingJacksonValue.setJsonpFunction(callback);
		return mappingJacksonValue;
	}
}

(3)测试
当访问地址如下的时候:

http://localhost:7002/MappingJacksonValueTest

控制台以json格式输出:

{
    "data": "tagDatas"
}

当访问地址如下的时候:

http://localhost:7002/MappingJacksonValueTest?callback=callTest

控制台能够携带callback数据返回,输出如下:

/**/callTest({
    "data": "tagDatas"
});

注意:
当我们使用官方的org.json,会报出下面的错误,我们需要使用com.alibaba.fastjson依赖。

Could not write JSON: No serializer found for class org.json.JSONObject

  即java中原生态org.json.JSONObject不能作为返回值返回json数据,如果需要返回的话,我们需要将JSON对象转换为字符串JSONObject.toString(),将其作为String字符串返回到前端,然后在前台在转换成json数据,这样来说就比较麻烦。
  因此,我们可以使用com.alibaba.fastjson的JSONObject对象,该对象可以直接作为json数据返回到前端。
参考代码如下:

@Controller
public class Y6ItemController {
	@RequestMapping(value = "/orgjson")
	@ResponseBody
	public Object orgjson() {
		//import org.json.JSONObject;
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("data", "tagDatas");
		return jsonObject.toString();

		//上下代码同
		//import com.alibaba.fastjson.JSONObject
//		JSONObject jsonObject = new JSONObject();
//		jsonObject.put("data","tagDatas");
//		return jsonObject;
	}
}	
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页