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;
    }
}
原文地址:https://www.cnblogs.com/fangwu/p/8718915.html