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

sendRedirect未按预期工作且无异常抛出问题排查

问题排查与解决思路

嘿,我一眼就揪出问题根源了——你用AJAX($.ajax)发起了logout请求,而浏览器只会对直接的页面级请求(比如点击链接、表单提交)自动处理重定向响应,AJAX请求的重定向结果只会被JS代码接收,不会触发浏览器跳转。

咱们拆解下你的代码细节:

  • 后端Controller的sendRedirect其实是正常工作的,它返回了302状态码和跳转地址,但前端用AJAX接收了这个响应,浏览器根本没机会执行跳转动作。
  • 你的AJAX还设置了dataType: "json",但重定向响应不是JSON格式,这甚至可能让AJAX进入错误回调(你没写完JS代码,可能没注意到这点)。

两种可行的修复方案

方案1:换掉AJAX,用直接跳转(最省事)

既然logout就是要跳转到首页,完全没必要用AJAX,直接让按钮触发页面请求就行:

修改HTML按钮,把按钮换成链接(样式保持不变):

<span class="submitButton">
  <a href="/logout" class='btn btn-primary pull-right'>Logout</a>
</span>

要是你非得保留按钮,就修改JS函数:

function returnHomepage() {
  // 直接让页面跳转到logout接口,交给后端处理重定向
  window.location.href = "/logout";
  return false;
}

方案2:后端返回跳转地址,前端手动跳转(适合必须用AJAX的场景)

如果因为业务需求必须保留AJAX(比如要先执行一些前端逻辑),那后端别用sendRedirect,改成返回JSON格式的跳转地址,前端收到后手动执行跳转:

后端Controller修改:

@RequestMapping(value = "/logout", method = RequestMethod.GET)
@ResponseBody
public Map<String, String> logout(HttpServletResponse response, HttpServletRequest request) throws Exception {
    eraseCookie(request, response);
    Map<String, String> responseData = new HashMap<>();
    responseData.put("redirectTo", "/index.html");
    return responseData;
}

前端JS修改:

function returnHomepage() {
    $.ajax({
        url: "/logout",
        dataType: "json",
        success: function(res) {
            // 拿到后端返回的地址后手动跳转
            window.location.href = res.redirectTo;
        },
        error: function() {
            // 出错时也兜底跳转到首页
            window.location.href = "/index.html";
        }
    });
    return false;
}

额外检查点

  • 如果你用了Spring Security之类的安全框架,要确认自定义的/logout接口没和框架默认的logout端点冲突,有些框架会拦截这类请求做特殊处理。
  • 打开浏览器控制台的Network面板,看看/logout请求的响应:确认状态码是302,Response Headers里有正确的Location: /index.html,这能帮你确认后端确实发送了重定向响应。

内容的提问来源于stack exchange,提问作者Nagendra K S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:40:48