只争朝夕 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() + ")");
}