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 调用无法执行的主要内容,如果未能解决你的问题,请参考以下文章

SP706SEN片子的作用

为啥它在控制台进程中以退出代码 0 结束而不是打印 'sen' 变量这样说? [复制]

HttpServletResponse 类

servlet HttpServletResponse类

编译的 MATLAB 错误:“struct”类型的输入参数的未定义函数“ft_datatype_sens”

R语言中的Theil-Sen回归分析