后台代码返回json数据没有接收到?

这是JS代码
var loading = new Loading();
var layer = new Layer();
$('Account').onclick = function(e){
var newProducts = products.map(function(arr){
return {'id':arr.id,'number':arr.num};
});
console.log(newProducts);
var ele = e.target;
layer.reset({
content:'确认购买吗?',
onconfirm:function(){
layer.hide();
loading.show();

                var xhr = new XMLHttpRequest();
                var data = JSON.stringify(newProducts);
                xhr.onreadystatechange = function(){
                     if(xhr.readyState == 4){
                            var status = xhr.status;
                            if(status >= 200 && status < 300 || status == 304){
                                var json = JSON.parse(xhr.responseText);
                                if(json && json.code == 200){
                                    loading.result('购买成功',function(){location.href = './account.html';});
                                    util.deleteCookie(name);
                                }else{
                                    alert(json.message);
                                }
                            }else{
                                loading.result(message||'购买失败');
                            }
                        }
                };
                 xhr.open('post','/api/buy');
                 xhr.setRequestHeader('Content-Type','application/json');
                 xhr.send(data);
            }.bind(this)
        }).show();
        return;
};

@Controller
下面是java代码:
@RequestMapping(value = "/api")
public class BuyApiController {

@Autowired
TransactionService transactionServiceImpl;

@ResponseBody
@RequestMapping(value = "/buy",method= RequestMethod.POST,produces = MediaType.JSON)
public JsonResult api_buy(HttpSession httpSession,
        @RequestParam("id") Long product_id)
{
    System.out.println("Class BuyApiController Method api_buy");
    System.out.println("[product_id]:" + product_id);

    //session
    System.out.println("[session.id]:" + httpSession.getId());
    UserVO userVO = (UserVO) httpSession.getAttribute("user");

    JsonResult jsonResult = new JsonResult();
    if(product_id == null)
    {
        //请求参数有错误 http status code is 400
        jsonResult.setCode("400");
        jsonResult.setMessage("购买失败");
        jsonResult.setResult(false);
    }
    else
    {
        if(userVO == null)
        {
            //401 Unauthorized当前请求需要验证
            jsonResult.setCode("401");
            jsonResult.setMessage("购买失败");
            jsonResult.setResult(false);
        }
        else if(userVO.getUsertype() == 0)
        {
            //buy
            try {
                this.transactionServiceImpl.buy(userVO, product_id);

                jsonResult.setCode("200");
                jsonResult.setMessage("购买成功");
                jsonResult.setResult(true);
            }
            catch (Exception e)
            {
                System.out.println("[Exception]:" + e.toString());
                jsonResult.setCode("400");
                jsonResult.setMessage("购买失败");
                jsonResult.setResult(false);
            }
        }
        else if(userVO.getUsertype() == 1)
        {
            //403 Forbidden,当卖家点击进入购买时,则发生没有权限,导致操作拒绝
            jsonResult.setCode("403");
            jsonResult.setMessage("购买失败");
            jsonResult.setResult(false);
        }
        else
        {
            //403 Forbidden未知身份发生购买,拒绝
            jsonResult.setCode("403");
            jsonResult.setMessage("购买失败");
            jsonResult.setResult(false);
        }
    }

    return jsonResult;
}

}

后台代码返回json数据没有接收到?

前端ftl:
这是前台ftl代码:

已添加到购物车的内容

退出 购买

<#include "/include/footer.ftl">


这是前台ftl代码:

退出 购买

<#include "/include/footer.ftl">


这种问题,开firebug真的难找么?看一下请求是否完整,客户端返回数据都可以看到,response有数据就打js断点,response没数据就后台接口打断点,多简单的事情,又不是多莫名其妙的bug


    xhr.onreadystatechange = function () {
        if (xhr.readyState == 4) {
            var status = xhr.status;
            if (status ==200) {//直接判断200状态就行了
                var json = JSON.parse(xhr.responseText);
                if (json && json.code == 200) {
                    loading.result('购买成功', function () { location.href = './account.html'; });
                    util.deleteCookie(name);
                } else {
                    alert(json.message);
                }
            } else {//不是200看服务器端返回什么内容
                alert(xhr.responseText)
                //loading.result(message || '购买失败');
            }
        }
    };

这样判断 ,必须要加括号 if((status >= 200 && status < 300) || status == 304){}

var json = JSON.parse(xhr.responseText);这个之前打印下xhr.responseText