HttpServletResponse 的 sendRedirect 调用无法执行
Posted
技术标签:
【中文标题】HttpServletResponse 的 sendRedirect 调用无法执行【英文标题】:HttpServletResponse's sendRedirect call could not execute 【发布时间】:2021-12-15 19:52:12 【问题描述】:在通过邮递员 PUT 请求 "/maths/answer"
对请求正文 MathsAnswer
进行更新后一分钟,我正在尝试自动将用户重定向到 URL "/timeUp"
。所以我选择跟踪更新请求发出的时间。使用@Scheduled
注释的方法delay()
不断比较请求发出的时间和当前时间分钟,以决定是否发送重定向。但是,堆栈跟踪报告了响应已提交的错误。
控制器类:
@RestController
public class MathController
private MathService service;
public boolean start = false;//checks if PUT request has been made
private int time = 0;
private HttpServletResponse myResponse;
//constructors omitted
@PutMapping("/maths/answer")
public ResponseEntity<Object> addSolution(@RequestBody MathsAnswer from,
HttpServletResponse res)
this.myResponse = res;
this.start = true; //PUT request has been made
this.time = LocalTime.now().getMinute();//request made at
return new ResponseEntity<Object>(service.addSolution(from), HttpStatus.OK);
@Scheduled(cron = "* * * * * ?")
public void delay() throws Exception
int now = LocalTime.now().getMinute();
if(start)
if(now - time >= 1 || time - now >= 1)
callTimeUp(new HttpServletResponseWrapper(myResponse));
public void callTimeUp(HttpServletResponse response) throws Exception
System.out.println("Inside calltimeup");
response.sendRedirect("/timeUp");
@GetMapping("/timeup")
public ResponseEntity<Object>timeUp()
return new ResponseEntity<Object>("Your time is up", HttpStatus.GATEWAY_TIMEOUT);
堆栈跟踪:
java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed
【问题讨论】:
【参考方案1】:这里的问题是您的代码尝试修改第一次调用/maths/answer
的响应,但您不能这样做。该响应已发送给客户端。
据我了解,您想要这样的东西:
-
用户调用
/maths/answer
- 响应代码200
用户调用/maths/answer
- 响应发送后的分钟 - 重定向到/timeup
为此,您需要检查 addSolution
中的时间,然后相应地修改响应...这里不需要 cron 作业
【讨论】:
以上是关于HttpServletResponse 的 sendRedirect 调用无法执行的主要内容,如果未能解决你的问题,请参考以下文章
为啥它在控制台进程中以退出代码 0 结束而不是打印 'sen' 变量这样说? [复制]