在客户端使用JSONP做跨域请求

在javascript/ajax中,由于安全原因,请求都是是遵循“同源策略”的,即不能请求其他域名内(任何其他二级以下域名或其他端口)的资源。但<script>的src属性可以指定为其他域的文件!!所谓jsonp就是跨域问题的一种掉渣的解决方案,原理正是利用script的这一特性。

首先,在客户端页面(domain1/jsonp.html)定义一个callback方法

<script type="text/javascript">
function callback(data){
if (data.successful){
alert("成功,结果:"+data.value);
}else{
alert("失败");
}
}
</script>


其次,在DOM创建一个script节点,指定URL就可以

var url = "http://10.46.168.39:8080/http/gateway.htm?serviceId=in_http_gw_config&clientId=app_test&jsonp=callback";
var script = document.createElement('script');
script.setAttribute('src', url);
document.getElementsByTagName('HEAD')[0].appendChild(script);

当然,下面这样会更简单一点:

<script type="text/javascript" src="http://10.46.168.39:8080/http/gateway.htm?serviceId=in_http_gw_config&clientId=app_test&jsonp=callback"></script>


最后,在服务端的Servlet:http://10.46.168.39:8080/http/gateway.htm只要输出一行js语句就可以

String jsonp = req.getParameter("jsonp");
if (!StringUtils.isEmpty(jsonp)){
    out.print(jsonp+"("+responseText+");");

}

==========================================

本来这样就够简单了,但jQuery比较多事,闲得无聊它也实现jsonp的功能。那么,只要将第二步改一下就可以:

<script type="text/javascript" src="/js/jquery-2.1.4.min.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        $.ajax({
             url:'http://10.46.168.39:8080/cxf/http/gateway.htm?serviceId=in_http_gw_config&clientId=app_test&jsonp=callback',
             dataType:"jsonp",
             //jsonp:"jsonp",
     //jsonpCallback:"callback",
             success:function(data){
                 alert('success'+data.value.value);
             }
        });
    });
</script>

注:如果在url中增加 &jsonp=callback,本人测试发现success函数不会执行。如果url不包含参数“jsonp”,那么请利用jquery的其他两个参数:jsonp:参数名,jsonpCallback:参数值,这种做法最后可以执行success方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值