1.如果自己能够控制服务端,则可以在服务端加上这句:response.setHeader("Access-Control-Allow-Origin", "*");
但是这个方法有个问题:就是ie不支持。所以也没什么用了。
2.如果用jsonp的方法都可以解决问题。但是用jsonp只能用get方法,不能用post方法。所以,我们可以把post的方法用get的实现。
客户端的代码如下:
$.ajax({
type: 'GET',
async:false,
url: web_path + '/grid/onlineparam/getonlineparam.do',
crossDomain: true,
data: {'projectid': projectid, 'page': 1, 'rows': 10},
dataType: 'jsonp',
jsonp: 'jsoncallback',
success: function(responseData, textStatus, jqXHR) {
$('#datagrid').datagrid('loadData', responseData);
}
});
服务器的关键代码如下(要写回调函数):
。。。省略其他代码
String callback= request.getParameter("jsoncallback");
String data = callback+"(" + m.toJSONString() + ")" ;
return data;
完整代码如下(用spring mvc,其中method = {RequestMethod.POST, RequestMethod.GET},可以支持post和get方法。
produces = {"application/json;charset=UTF-8"},解决中文乱码)
@RequestMapping(value = "/grid/onlineparam/addonlineparam", method = {RequestMethod.POST, RequestMethod.GET},produces = {"application/json;charset=UTF-8"})
@ResponseBody
public String addOnlineParam(HttpServletResponse response, HttpServletRequest request,
@RequestParam(value = "projectid", required = true) String projectid,
@RequestParam(value = "paramname", required = true) String paramname,
@RequestParam(value = "paramvalue", required = true) String paramvalue,
@RequestParam(value = "remark", required = true) String remark){
message m = new message();
String callback= request.getParameter("jsoncallback");
projectid = Function.dealNull(projectid);
paramname = Function.dealNull(paramname);
paramvalue = Function.dealNull(paramvalue);
remark = Function.dealNull(remark);
try {
/*务业处理代码*/
m.setResult("00");
m.setDetail("操作成功!");
} catch (Exception e) {
m.setResult("01");
m.setDetail("操作失败!");
}
String data = callback+"(" + m.toJSONString() + ")" ;
return data;
}
3.第三种方法是用iframe方式实现。设置document.domain。但是这种方法只能是两者在同一子域下面。如download.test.com和haha.test.com就是同一子域。
可设document.domain="test.com"。但如果是downloadtest.com和haha.test.com就不是同一域下了。
总结下:目前最好的实现方式,我觉得是第二法用jsonp的型式。
其实jsonp理的原理还是用<script src="server.do?jsonp=callback&id=1"></script>来实现的。
<script type="text/javascript">
function callback(服务器返加的json格式的数据){//回调函数
处理代码。。。。
}
</script>
补充一个:由于跨域只是在js之间存在跨域,因为可以写一个服务作为代理跳转,用平台去访问,这样就不存在跨域了。如前端(和最终的服务器不同域)---->服务---->最终的服务器,而不是前端(和最终的服务器不同域)--->最终的服务器