jQuery和java后台的jsonp跨域问题

Jsonp原理:

  ajax本身是不可以跨域的,通过产生一个script标签来实现跨域。因为script标签的src属性是没有跨域的限制的。其实设置了dataType: ‘jsonp’后,$.ajax方法就和ajax XmlHttpRequest没什么关系了,取而代之的则是JSONP协议。JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问。
  
  JSONP是一种脚本注入(Script Injection)行为,所以也有一定的安全隐患。首先在客户端注册一个callback (如:’jsoncallback’), 然后把callback的名字(如:jsonp1236827957501)传给服务器。注意:服务端得到callback的数值后,要用jsonp1236827957501(……)把将要输出的json内容包括起来,此时,服务器生成 json 数据才能被客户端正确接收。

然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 ‘jsoncallback’的值 jsonp1236827957501 .

最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。

客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时javascript文档数据,作为参数,
传入到了客户端预先定义好的 callback 函数(如上例中jquery $.ajax()方法封装的的success: function (json))里.(动态执行回调函数)

可以说jsonp的方式原理上和是一致的(qq空间就是大量采用这种方式来实现跨域数据交换的) .

页面中js为:

$.ajax({
             url: "http://" + ipPort + "/user/getUser",
             type: 'GET',
             dataType: 'jsonp',
             jsonp: 'callback',                                
             success: function (data) {
                   alert('success:'+data);
             },
             fail: function () {
                   alert('fail');
             }
});   

java后台中的代码为:

/**
 * 直接输出.处理jsonp返回的数据
 */
public static void printJsonData(String text){
    PrintWriter print;
    try {
        HttpServletRequest request = ThreadContextHolder.getHttpRequest();
        HttpServletResponse response = ThreadContextHolder.getHttpResponse();
        response.setContentType("text/html;charset=utf-8");
        print=response.getWriter();
        String jsonp=request.getParameter("callback");//callback为回调函数名,要和js名保持一致
        if(jsonp!=null){
            text=jsonp+"({\"data\":"+text+","+"\"token\":\""+StringUtil.token()+"\"})";
        }else{
            text="{\"data\":"+text+","+"\"token\":\""+StringUtil.token()+"\"}";
        }
        print.write(text);
        print.close();
    } catch (IOException e) {
        System.err.println(e.getMessage());
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值