jsonp 跨域
一、跨域条件( 跨域是浏览器的限制 )
1、域名不同
2、端口不同
二、解决跨域 ( 浏览器虽然不能跨域请求服务,但是可以跨域请求 js 文件 )
1、js ajax 写法
$.ajax({ url : "/userService/getUserById", type : "POST", dataType : "jsonp", // 返回的数据类型,设置为JSONP方式 data : { id : 1 }, success: function(data){ } });
2、服务端第一种写法 ( spring4.1 之前 )( jsonp 请求的,会带默认一个 callback 参数 )
@Controller public class UserController { @Autowired private UserService userService; @RequestMapping(value="/userService/getUserById/{id}",produces=MediaType.APPLICATION_JSON_UTF8_VALUE")//application/json;charset=utf-8 @ResponseBody public String getUserById(@PathVariable String id, String callback) { Map result = userService.getUserById(id); //响应结果之前,判断是否为jsonp请求 if (StringUtils.isNotBlank(callback)) {//判断 callback 是否为空,因为如果是 jsonp 请求的,会带默认一个 callback 参数 //把结果封装成一个js语句响应 return callback + "(" + JsonUtils.objectToJson(result) + ");"; } return JsonUtils.objectToJson(result); } }
3、服务端第二种写法 ( spring4.1 之后 )( jsonp 请求的,会带默认一个 callback 参数 )
@Controller public class UserController { @Autowired private UserService userService; @RequestMapping(value="/userService/getUserById/{id}") @ResponseBody public Object getUserById(@PathVariable String id, String callback) { Map result = userService.getUserById(id); //响应结果之前,判断是否为 jsonp 请求 if (StringUtils.isNotBlank(callback)) { //把结果封装成一个js 语句响应 MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result); mappingJacksonValue.setJsonpFunction(callback); return mappingJacksonValue; } return result; } }