使用JSONP 处理跨域请求

注:为了解决实际项目中因跨域访问js问题而写的有关jsonp的Demo,记录如下。

 

一、相关定义。

JSONP(JSON with Padding):JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。 

 

二、JSONP由何演化。

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Jsonp的使用</title>

<script type="text/javascript">
function showPrice(data) {
    alert("Symbol: " + data.symbol + ", Price: " + data.price);
}
</script>
<script type="text/javascript">
showPrice({symbol: 'IBM', price: 91.42});
</script>
</head>
<body>

</body>
</html>

 

三、JSONP的简单使用

 

hellojsonp.jsp 如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>jsonp的用法</title>

 <script type="text/javascript">  
        function jsonpCallback(result)   
           {   
             alert(result.msg);   
           }   
       </script>  
<script type="text/javascript" src="http://192.168.11.139:8081/MyWeb/HelloJsonp?jsonp=jsonpCallback"></script>  
</head>
<body>

</body>
</html>

 后台 HelloJsonp.java  相关代码 如下:

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
  String jsonData = "{msg:'hello jsonp,haha'}";
  String output = "jsonpCallback" + "(" + jsonData + ");";
  response.setCharacterEncoding("UTF-8");
  response.setContentType("text/javascript");          
  PrintWriter out = response.getWriter();
    System.out.println(output);
  out.println(output);  
 }

 

四、Jquery 对Jsonp的支持。

 

jsonpinjquery.jsp 如下:

 

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSONP IN  JQUERY</title>

<script src="<%=basePath%>js/jquery-1.4.4.js"></script>

<script type="text/javascript">

jQuery.getJSON("http://192.168.11.139:8081/MyWeb/TestJson?callback=?", 
function(data) {
    alert("symbol:"+data.symbol+",price:"+data.price);
});

</script>
</head>
<body>
<h3>JSONP IN  JQUERY</h3>
</body>
</html>

 后台 Servlet TestJson.java 相关代码 如下:

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  String jsonData = "{'symbol' : 'IBM', 'price' : '91.42'}";
  String output = request.getParameter("callback") + "(" + jsonData + ");";
  response.setCharacterEncoding("UTF-8");
  response.setContentType("text/javascript");     
  PrintWriter out = response.getWriter();
  System.out.println(output);
  out.println(output);
  // prints:jsonp1232617941775({"symbol" : "IBM", "price" : "91.42"});
 }

 

注:

1、http://192.168.11.139:8081/MyWeb/TestJson 为后台处理jsonp 的地址。

2、后台给前台的数据格式要为:jsonp1232617941775({"symbol" : "IBM", "price" : "91.42"}) 

jsonp1232617941775 为自动生成,后台从前台获取 )

 

 

四、相关参考:http://www.ibm.com/developerworks/cn/web/wa-aj-jsonp1/

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值