jsonp跨域

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);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值