关于Ajax跨域问题的一些经验 框架用的是JQueryMobile
最近用JQueryMoblie嵌入项目的appl里涉及到Ajax异步刷新listView,最初的代码是: $.ajax({ url : url,type : "POST",data : JSON.stringify(ajax_data),dataType : "json",// 返回数据为json contentType : "application/json;charset=UTF-8",success:function(m){ alert(m); } })但是不幸的是……出现了这种错误: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access." 百度了一下说是这是跨域造成的。 知道哪里错了就开始改进吧,用的是Ajax自带的jsonp解决的跨域问题: $.ajax({ url : url,dataType : "jsonp",// 返回数据为jsonp contentType : "application/json;charset=UTF-8",jsonp : "callbackparam",jsonpCallback : "success_jsonpCallback",success:function(m){ alert(m); } })1、这里面的type类型是POST,但是jsonp用的是GET应该是Ajax设定的,所以后台接受的时候也要是GET模式接受 2、dataType : "jsonp" jsonp设置的传回来的类型必须是jsonp 3、jsonp : "callbackparam" 和 jsonpCallback : "success_jsonpCallback"这个使用jsonp的固定格式,必须添加的(参数随意),后台也要根据jsonp格式对json字符串做下改动 4、后台。我用的是Spring-MVC,为了实现效果,先试用最简单的方法,代码如下: @RequestMapping(value = "/sale/getWebList",method = RequestMethod.GET) public void getSaleList(HttpServletRequest request,HttpServletResponse response) throws IOException { String callBack = request.getParameter("callbackparam");//此时得到的callback 就是前台设置的success_jsonpCallback,用于后面对json的处理 String prefType = null; String card = null; String city = null; String mcType = null; String pageSize = null; String pageNum = null; try { prefType = java.net.URLDecoder.decode(request.getParameter("prefType"),"UTF-8"); card = java.net.URLDecoder.decode(request.getParameter("card"),"UTF-8"); city = java.net.URLDecoder.decode(request.getParameter("city"),"UTF-8"); mcType = java.net.URLDecoder.decode(request.getParameter("mcType"),"UTF-8"); pageSize = request.getParameter("pageSize"); pageNum = request.getParameter("pageNum"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } finally { log.info(request.toString()); } List<SaleInfo> saleList = saleSearchService.getSaleList(prefType,card,city,mcType,pageNum,pageSize); Gson gson = new Gson(); String saleGson = gson.toJson(saleList); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); PrintWriter out = response.getWriter(); out.print(callBack + "(" + saleGson + ")");//研究了json和jsonp的区别之后,发现jsonp就是在json的外围用callback加了一层封装,然后传给前台 }因为这个项目从前台传递过来的参数可能包含中文,为了解决中文乱码问题,需要在前台的参数上面进行编码操作:"prefType" : encodeURI(v_prefType) 然后后台接收的时候对字符串进行解码操作:prefType = java.net.URLDecoder.decode(request.getParameter("prefType"),"UTF-8"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |