闲来无事,想起跨域问题。
框架是struts +spring ,前端是 jquery
后台代码如下
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
String callback = request.getParameter("callback");
String jsonpcallback = request.getParameter("callback");
jsonpcallback = jsonpcallback == null ? "" : jsonpcallback;
String bln = "1";
String taskid = "1";
String json = jsonpcallback+ "({ returnFlag:"+bln+",taskid:"+taskid+"});";
setInputStream(new ByteArrayInputStream(json.getBytes("UTF-8")));return SUCCESS;
前端js代码如下
$.ajax({
url : "http://localhost:8089/xx/xx/xx.action?callback=?", //(本地用8080,8089则是跨域了)
type:'GET',
dataType : "jsonp",
data:"{}", //不需要传数据时 ,也要写
jsonp: "callback",
jsonpCallback: "jsonpcallback",
success : function(resp){
alert(resp.returnFlag);
},
error : function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
alert(textStatus);
}
});
需要注意的是
1:js中 ajax的url中callback 传的是什么,后台的jsonpcallback 就是什么,如果callback=? ,此时,后台获取到的callback是null,则jsonpcallback =“”(空字符串)
2:json与jsonp 格式对比
json格式:
{ returnFlag:1,taskid:1}
({ returnFlag:1,taskid:1});