JSONP跨域实现

只争朝夕 2014-03-09

简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即“同源策略”。而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果。

具体策略限制情况可看下表:

URL说明允许通信
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹允许
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口不允许
http://www.a.com/a.js
https://www.a.com/b.js
同一域名,不同协议不允许
http://www.a.com/a.js
http://127.0.0.100/b.js
域名和域名对应ip不允许
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同不允许
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名(同上)不允许
http://www.a.com/a.js
http://www.b.com/b.js
不同域名不允许

 (以上参考:http://www.open-open.com/lib/view/open1344558130468.html

本人只实现了同同一台web服务器下面不同的web工程之间的通信。

其主要代码如下:

test1,发起请求:

 function jsonPTest1(){
  $.ajax({
   url:'http://localhost/test2/JSONTestServlet',
   data:{
    userName:'hello'
   },
   type:"get",/**只能是get*/
   dataType:'jsonp',/**jsonp*/
   callback:'callback',/**用户后台拼接返回的字符串*/
   success:function(data){
    alert(data.userName);
   }
   
  });
  
 }

test2:,相应请求:

 /**
  * 处理servlet,返回JSONP数据格式
  */
 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  String callback = request.getParameter("callback");  //用于得到回调参数
  String userName = request.getParameter("userName");
  JSONObject jo = new JSONObject(); //用的json-lib.jar
  jo.put("userName", userName);
  response.setContentType("text/html");
  PrintWriter writer = response.getWriter();
  writer.print(callback + "(" + jo.toString() + ")");
 }

相关推荐

ganyouxianjava / 0评论 2012-05-31