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

配置JWT access个人消息时捕获JWT异常提示响应已提交返回500错误

问题根因

抛出Unable to handle the Spring Security Exception because the response is already committed异常、接口固定返回500的核心逻辑是:JWT校验逻辑触发异常时,HTTP响应已经被前置逻辑提交(即响应状态、响应头已经写入并刷出到客户端),此时再调用response.sendError()尝试修改响应、返回自定义信息会操作失败,Spring Security内置的异常处理器也无法再接管响应处理,最终返回500状态码。

修复方案
  • 替换sendError的响应写法,在JWT异常捕获块中直接手动设置响应状态、写入自定义错误体,写完后直接终止当前过滤器逻辑,不要将异常继续抛给后续过滤器链处理,参考实现:
// JWT过期、签名无效等异常捕获后的处理逻辑
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
response.setContentType("application/json;charset=UTF-8");
// 组装自定义错误返回结构
Map<String, Object> errorResp = new HashMap<>();
errorResp.put("code", 400);
errorResp.put("message", "Invalid JWT Token");
// 将错误信息写入响应流
PrintWriter out = response.getWriter();
out.print(new ObjectMapper().writeValueAsString(errorResp));
out.flush();
out.close();
// 核心:直接return结束当前过滤器执行,不要向后传递请求/异常
return;
  • 校验JWT认证过滤器的注册顺序,确保该过滤器在Spring Security自带的ExceptionTranslationFilter之前执行,避免链路上其他过滤器提前提交响应。
  • 排查整个过滤器链逻辑,删除同一次请求中重复提交响应的代码,比如重复调用sendError、sendRedirect,或者写入响应后未终止逻辑继续执行后续过滤流程的问题。

提示:一旦调用response.flushBuffer()、响应流close()方法,就代表响应已经提交,后续所有修改响应状态、响应头的操作都会失效,所有自定义响应逻辑必须在响应提交前完成。

内容的提问来源于stack exchange,提问作者Robs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:48:25