由于xMLHttpRequest的局限性,使其不能跨域去请求,而页面中引用的js和css,甚至是iframe则不存在跨域的问题
利用这一特性:页面在处理跨域请求的时候,共衍生出一下两种形式,jsonp和隐藏iframe。
jsonp形式,使用方便,用get方式传输,传输的数据量有限
隐藏iframe形式,会出现返回延时的现象(在iframe的数据未完全加载时,主页面的js已经执行)
1.jsonp的后台action中处理方式:
public void jsonpMethod (){
PrintWriter out=null;
try{
jsonmap = new HashMap();
jsonmap.put("successed", true);
String callBack = ""+ callback +"("+ JSONUtil.serialize(jsonmap) +")";
response.setCharacterEncoding("utf-8");
response.setContentType("text/javascript;charset=utf-8");
response.setHeader("Cache-Control", "no-cache");
out = response.getWriter();
out.write(callBack);
} catch (Exception e) {
throwException(e);
}
}
备注:callback 属于前台传来的参数
jsonp的前台调用形式
var url=http://log.coa.sgcc.com.cn:8006/coa-webapp/json/jsonpMethod .action
jQuery.ajax({
type : "get", //获取形式
url : url, //请求url
dataType : "jsonp", //标明是jsonp的形式
jsonpCallback:"callback",
async : false,
cache : false,
data: {querycond:querycond}, //条件
success : function(json) {
alert(json.list[0].unitName)
}
})
2.隐藏iframe形式:
在主页面中嵌套iframe,而iframe可以为其他域名,待iframe返回数据后,通过回调函数执行主页面中的处理。其中嵌套iframe是放在其他域名的服务器上
<html>
<head>
<script type="text/javascript" >
//获取Solr服务器上的数据
function getSolrXml(data){var url="http://search.sgcc.com.cn:8088/searcher/SearcherSelectServlet/select";
jQuery.ajax({
type: "post",
url: url,
data: encodeURIComponent(data.queryService) ,
async: true,
cache: false,
timeout: 60000,
success: function(resp){
parent.displayXmlToPage(resp) //回调主页面的函数
}
})
}
</script>
</head>
<body onload="parent.isChildLoaded = true;">测试solr</body>
</html>
主页面:
<html>
<head>
<script type="text/javascript" >
var isChildLoaded=false;
//对获取的数据进行展现
displayXmlToPage(resp){
//处理函数
}
if(isChildLoaded){
getSolrXml(data);//执行iframe的上的函数
}else{
setTimeOut(getSolrXml,50);
}
</script>
</head>
<body >
<iframe1 src="${solrSearchURL}/searcher/solr.jsp " id="solrIframe" style="display:none"></iframe1 >
备注:此处写iframe1是为了防止博客园自动转换成iframe。
</body>
</html>
此处需要注意的问题以及解决方案:由于js在浏览器中的执行顺序, solr.jsp 并么有加载,上面的getSolrXml(data)已经执行,页面则会报js的错误
解决方案: 1,鉴于页面的加载顺序,将iframe尽量放在页面的最上端,js函数放在最后执行
2,在引用js时尽量使用ref延缓执行,但可能存在浏览器的兼容性问题
3,在主页面上判断iframe是否加载成功,如果加载成功则执行,如果没有加载成功则延时再去判断