最近一直在做电子商务方面的项目,包括买家和卖家后台 分别在seller.com 和buyer.com 还有前台www.xxx.com
其中有一个查看商品二级分类的下拉框 需要查询 当时没有考虑到这三个项目都会用到 就放到了前台的代码中,后台需求的变化,卖家和买家后台也要用到这个接口
由于初始化前台页面的时候是用ajax的方式初始化这个下拉框的,所以其他的平台的调用也想到了这个问题,紧接着就遇到ajax跨域的问题 ,下面来提供解决的方法。
下面是action的代码 由三个系统共同调用
public class HeadAction extends BaseAction{ private HttpServletRequest request; private HttpServletResponse response; public void findSecondCat(){ ActionContext ctx = ActionContext.getContext(); request = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST); response = (HttpServletResponse)ctx.get(ServletActionContext.HTTP_RESPONSE); //response.setHeader("Cache-Control", "no-cache"); response.setContentType("text/json;charset=utf-8"); String catType = request.getParameter("catType"); List<CategoryNode> node = CategoryCache.getAllCategoryNodes(1, Integer.parseInt(catType));//调用缓存查询分类 try { PrintWriter out = response.getWriter(); JSONArray ja = new JSONArray(); for(CategoryNode c: node){//返回json格式 JSONObject j = new JSONObject(); j.put("id", c.ID); j.put("name", c.Name); ja.add(j); } String cb = request.getParameter("callback");//若果是ajax请求会带这个参数 你可以firfox的firbug跟踪一下就看到了 if(cb != null){//如果是跨域 StringBuffer sb = new StringBuffer(cb); sb.append("("); sb.append(ja.toString()); sb.append(")"); out.write(sb.toString()); out.close(); }else{//不跨域的情况 out.write(ja.toString()); out.close(); } } catch (IOException e) { e.printStackTrace(); } } }
下面是js代码
$.ajax( { type : 'get', url : '<%=com.utils.PubConstant.wwwDomain %>/index/findSecondCat.action', data : { catType : 1 }, dataType : 'jsonp',//跨域必须用jsonp error : function() { }, success : function(data) { innerOption = "<option value=''>全部分类</option>"; for(var i=0;i<data.length;i++){ innerOption += '<option value="'+data[i].id+'">'+data[i].name+'</option>'; }; $('#secondCatIdId').html(innerOption); $("#lang, #secondCatIdId").jListbox(); } });
这样就可以跨域进行ajax请求了。