jsonp跨域

来源:互联网 发布:中华民族知乎 编辑:程序博客网 时间:2024/05/20 21:57

jsonp跨域请求

项目中的错误

因为js不支持跨域请求,而有时候又必须要对其他的系统进行跨域获取数据,测试中报错信息如下

XMLHttpRequest cannot load http://localhost:8088/item/token/b993c14f-de0d-4c36-ba1b-5123c17dc5f0. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8082' is therefore not allowed access.

所谓跨域:就是不同域名,同域名不同端口,同域名不同IP地址
在项目中:往往需要各个独立的应用中,js需要获取其他应用下的数据,但是js却不支持跨域请求,可能处于安全性考虑。

原理

jsonp的跨域可以算是js的一种漏洞,其原理是

<script src="/js/main.js"/>

script标签的src中url地址,这个标签可以加载跨域请求的js,并且返回这个js,这一点你可以只在开发者工具中直接查看。
利用script的src属性,我们在本地定义一个function demo1(data){对data进行业务处理}
一个跨域请求的ajax,请求数据,带参数callback=demo1,
支持jsonp的服务端,判断参数是否有callback,有的话
进行跨域处理,返回demo1({id:1,status:200})这样的数据,
js会认为这是一段js,执行我们已经定义好的demo1这个function

这里写图片描述

案例

----------//JS.ajax({            url : "http://localhost:8088/user/token/" + _ticket,            dataType : "jsonp",            type : "GET",            success : function(data){                if(data.status == 200){                    var username = data.data.username;                    var html = username + ",欢迎来到我的购物网 class=\"link-logout\">[退出]</a>";                    $("#loginbar").html(html);                }            }        });<span id="loginbar" style="margin-right: 15px;">            <a href="#">请登录</a>        </span>----------//Java代码/*  @RequestMapping("/token/{token}")    @ResponseBody    public String getCookieAndUser(@PathVariable String token,String callback){        Result result = tokenService.getCookieAndJson(token);        if(callback != null && !"".equals(callback)){            String call = callback + "("  +JsonUtils.objectToJson(result) +");" ;            return call;        }        return JsonUtils.objectToJson(result);    }*/    @RequestMapping("/token/{token}")    @ResponseBody    public Object getCookieAndUser(@PathVariable String token,String callback){        Result result = tokenService.getCookieAndJson(token);        if(callback != null && !"".equals(callback)){        //  String call = callback + "("  +JsonUtils.objectToJson(result) +");" ;            //return call;            MappingJacksonValue jacksonValue = new MappingJacksonValue(result);            jacksonValue.setJsonpFunction(callback);            return jacksonValue;        }        return JsonUtils.objectToJson(result);    }