ajax跨域问题
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() + ")" ;
完整代码如下(用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"> functioncallback(服务器返加的json格式的数据){//回调函数 处理代码。。。。 } </script>
补充一个:由于跨域只是在js之间存在跨域,因为可以写一个服务作为代理跳转,用平台去访问,这样就不存在跨域了。如前端(和最终的服务器不同域)---->服务---->最终的服务器,而不是前端(和最终的服务器不同域)--->最终的服务器 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |