You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Servlets与Ajax交互问题:无法触发success回调

问题解决:Ajax无法触发success回调的原因及修复方案

问题根源

你的Ajax请求设置了dataType:'json',这意味着jQuery会严格校验响应内容是否为合法JSON格式——哪怕Servlet返回200状态码,只要响应内容不是合法JSON(比如空字符串、纯文本"SUCCESS"),jQuery就会判定请求失败,触发error回调而非success。

具体修复步骤

1. 修改Servlet成功分支,返回合法JSON

在用户不存在、保存成功的分支里,必须返回符合JSON规范的内容,并设置正确的响应头:

else {
    adminSecurityDAOImpl.saveUser(user);
    // 设置响应类型为JSON,指定编码
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    // 返回合法的JSON字符串(哪怕是最简单的结构)
    response.getWriter().write("{\"status\":\"success\"}");
    response.flushBuffer();
    return;
}

2. 错误分支的优化(可选)

当前错误分支用response.sendError(400)的逻辑是正确的,会触发Ajax的error回调。如果想让前端动态获取错误信息,可以修改为:

if (adminSecurityDAOImpl.isUserExist(login)) {
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    // 先设置错误状态码,再返回JSON格式的错误信息
    response.sendError(400, "{\"error\":\"Пользователь с таким логином уже существует\"}");
    response.flushBuffer();
    return;
}

对应的前端error回调可以改为:

error : function(xhr, status, error) {
    var errorData = JSON.parse(xhr.responseText);
    $("#errorLogin").text(errorData.error);
}

3. 优化请求参数(可选)

你的请求URL里已经带了?save=save,同时data里又传了save: 'save',会导致请求参数重复。可以去掉URL里的参数,只用data传递:

url:"/adminUser",
data: {save: 'save', login:login, pass1:pass1, userName:userName, email:email,
    bukhUsersId: bukhUsersId, otdelId: otdelId, roleId: roleId, checkActive: checkActive},

内容的提问来源于stack exchange,提问作者egor-n

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:00:02