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;
}
}