Cannot call sendRedirect() after the response has been committed 异常解析
字面意思是response已经被提交无法再调用sendRedirect方法,出现该异常的原有有好几种:
- 重复调用sendRedirect方法
- 这个可能是代码中有多个逻辑判断跳转,执行完某个跳转后,程序继续往下执行其他的跳转。我们应该在执行完后立即return
- 在调用方法之前输出流被关闭了
- 在使用完out对象输出后,调用close()关闭
- 在调用方法之前输出刷新了
- 在使用完out对象输出后,调用flush()刷新
还有一种比较特殊的情况,属于第三种
在JSP页面编码时出现的错误,JSP页面中有很多HTML内容,我在结尾处使用了response.sendRedirect()后报错。单代码本身是没有问题的,后来找了半天发现,如果把HTML代码减少一些,就不会报错。
最后总结原因就是因为JSP翻译为Servlet后,所有HTML代码都是通过JspWrite对象的write方法打印输出的,JspWriter与PrintWrite都继承自java.io.Writer ,在调用write()方法写入的时候是写入到缓冲区,当缓冲区满的时候就会自动刷新输出。所以刷新输出后,再调用response.sendRedirect()就会报错了。