最近一直在做电子商务方面的项目,包括买家和卖家后台 分别在linuxidc.com 和linuxidc.net 还有前台
其中有一个查看商品二级分类的下拉框 需要查询 当时没有考虑到这三个项目都会用到 就放到了前台的代码中,后台需求的变化,卖家和买家后台也要用到这个接口。
由于初始化前台页面的时候是用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代码