背景:正在开发的系统中添加了一个聊天的模块,为了减轻系统本身服务器的压力,要把这个模块独立出来成为一个小工程,并且可能部署在不同的服务器上。这样,就产生了AJAX跨域问题。
解决办法,用下面这种形式可以完成跨域。传输方式get,类型jsonp。
请求端 JS:
function xx{
var param = "?"+"to_uid="+user_id;
var action = "getUnreadMsgRemind.action";
$.ajax({
type : "get",
async:false,
url : chatDir+action+param,
dataType : "jsonp",
jsonp: "callbackparam",
jsonpCallback:"success_UnreadMsgRemindCallback",
success : function(json){
if(json.result.count >= 1){
for(var i=0;i<json.result.count;i++){
if(talkingFriend != json.result.msglist[i]){
$("#"+json.result.msglist[i]).addClass("fred_msg");
}
}
}
},
error:function(){
}
});
}
服务端:
需要注意的是返回数据是JSON,所以要有一个数据转换过程;通过response返回数据;返回结果的头要加上callback;
public String getUnreadMsgRemind(){
String to_uid = this.getRequest().getParameter("to_uid");//从AJAX传来的参数
List list = chatMessageOperation.hasNewMessage(to_uid);//根据参数查询
this.jsonMap.put("count", list.size());//数据处理
this.jsonMap.put("msglist", list);
JsonDealUtil.dealMapTypeReq(jsonMap);//准备返回
return null;//esponse返回
}
public static void dealMapTypeReq(Map jsonMap){
try{
HttpServletRequest request = (HttpServletRequest)ServletActionContext.getRequest();
HttpServletResponse response = (HttpServletResponse)ServletActionContext.getResponse();
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
JSONObject obj = JSONObject.fromObject(jsonMap);
String callback = request.getParameter("callbackparam");
String jsoncallback = callback+"({'result':"+obj+"})";
PrintWriter out = response.getWriter();
out.print(jsoncallback);
out.flush();
out.close();
}
catch(Exception e){
}
}