上文粗略的讲了一下jsonp的使用,但是实际过程中很少没有返回的。
springboot支持增强控制器注解,实现选择性返回json或者jsonp。
1.新建jsonp基类
@ControllerAdvice(basePackages = "com.controller")
public class Jsonp extends AbstractJsonpResponseBodyAdvice {
public Jsonp() {
//构造函数
super("callback","jsonp");
}
}
增强注解,对应这个包com.controller
下。继承AbstractJsonpResponseBodyAdvice ,根据父类方法参数名生成对应的jsonp数据。上面的super表示访问地址如果参数是callback=xxx或者jsonp=xxx,就会把xxx的值作为回调名字返回
如:http://localhost:8080/index?callback=callback
返回:
/**/callback({“id”:12,”name”:”苍老师”});
2.新建一个vo类返回对象值
继承一下上面的类即可
public class Student extends Jsonp {
private int id;
private String name;
。。。
}
3.控制器
直接返回对象即可,如果中文乱码设置一下response的字符集即可。
@Controller
@RequestMapping(value = "", method = RequestMethod.GET)
public class IndexController {
// @CrossOrigin(origins = "*")
// @CrossOrigin
@RequestMapping(value = "/index")
@ResponseBody
public Student index(HttpSession session, HttpServletResponse response) throws IOException {
System.out.println("我的sessionId为" + session.getId());
Student student = new Student();
student.setId(12);
student.setName("苍老师");
response.setCharacterEncoding("utf-8");
return student;
}
}
访问地址:http://localhost:8080/index
返回正常json字符串
{“id”:12,”name”:”苍老师”}
访问带参数:http://localhost:8080/index?callback=callback
返回:
/**/callback({“id”:12,”name”:”苍老师”});
ajax写法
注释的地方可以省略,用默认即可。
$.ajax({
dataType:'jsonp',
//jsonp:"callback", //传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
//jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
url:"http://192.168.1.196:8080/index",
success:function(data){
console.log(data);
}
})