jsonp是ajax跨域解决方案的一种办法,就是借助标签<script></script>可以实现不同域之间数据请求的一种方式,类似iframe,不受跨域限制,它请求返回之后,会以一种回调的形式调起挂在window对象上的全局方法callback,这里的callback就是我们在url请求中指定的回调函数,参数就是我们请求服务端包装在callback之内的数据。
jsonp的实现,需要前后端配合,不是说前端可以实现,后端也可以实现,他们需要配合才能实现一个完整的jsonp请求。springboot1.x对jsonp还有一个AbstractJsonpResponseBodyAdvice的抽象类可以去实现jsonp,而无需改动普通的GET请求,但是在springboot2.x版本里面已经没有这个类了,所以又回到了springmvc阶段对jsonp的实现。
springboot对jsonp的实现,最简单的就是需要获取前端请求的callback参数,然后拼接返回结果组成字符串的形式返回。
springboot项目依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.58</version>
</dependency>
</dependencies>
Java代码部分对jsonp的配合处理:
package com.xxx.springboot.web;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.fastjson.JSON;
@RestController
@RequestMapping("/jsonp")
public class JsonpController {
@GetMapping("/test")
public String test(@RequestParam("callback")String callback) {
Map<Strin