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
相关产品推荐
相关产品推荐

