在客户端使用JSONP做跨域请求
2016-01-18 15:42
691 查看
在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方法。
首先,在客户端页面(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方法。
相关文章推荐
- 图片旋转、鼠标滚轮缩放、镜像、切换图片js代码
- cJson 创建与解析
- 利用Javascript来创建Ubuntu Scope
- javascript逻辑运算符“||”和“&&”
- 图片左右滚动的js代码
- JSP自定义标签由浅到深详细讲解(全)
- 简易富文本编辑器
- JSON
- DOM事件探秘之三-键盘事件
- jsonp 使用记录(二)跨域设置cookie
- 理解JavaScript中Promise的使用
- JS日期:根据出生日期 得到周岁年龄
- 使用rapidjson生成json串
- js split 的用法和定义 js split分割字符串成数组的实例代码
- .net 接口返回json格式示例
- jsonp 使用简单记录(一)
- 读写json中文ASCII乱码的问题
- 模仿console自写函数打印js的对象
- angular js过滤器
- jsp页面格式化日期 用jstl的fmt:formatDate 标签