当response提交后,不能调用sendError(),什么意思?

出现这个错误,一定是多次response导致的。可以这么理解,承载客户端和服务器进行Http交互的Socket连接已经关闭了,而你还试图发送数据给客户端,显然会出错。就好比我俩打电话,我都挂电话了,你还在“喂喂喂”。

例如下面这段代码就会出现此错误:

  1. import java.io.Writer;
  2. import javax.servlet.http.HttpServletResponse;
  3. import org.apache.struts2.ServletActionContext;
  4. import com.opensymphony.xwork2.ActionSupport;
  5. public class LoginAction extends ActionSupport {
  6. /**
  7. *
  8. */
  9. private static final long serialVersionUID = 1L;
  10. private String userName;
  11. private String pwd;
  12. private String verifyCode;
  13. private String ajax;
  14. // 错误的写法
  15. @Override
  16. public String execute() throws Exception {
  17. // 通过ajax登录
  18. if (ajax != null) {
  19. HttpServletResponse response = ServletActionContext.getResponse();
  20. Writer writer = response.getWriter();
  21. writer.write("登录成功!");
  22. writer.flush();
  23. writer.close();
  24. }
  25. return SUCCESS;
  26. }
  27. // 正确写法
  28. public String login1() throws Exception {
  29. if (ajax != null) {
  30. HttpServletResponse response = ServletActionContext.getResponse();
  31. Writer writer = response.getWriter();
  32. writer.write("登录成功!");
  33. writer.flush();
  34. writer.close();
  35. return null;
  36. }
  37. return SUCCESS;
  38. }
  39. // 正确写法
  40. public String login2() throws Exception {
  41. if (ajax != null) {
  42. HttpServletResponse response = ServletActionContext.getResponse();
  43. Writer writer = response.getWriter();
  44. writer.write("登录成功!");
  45. writer.flush();
  46. writer.close();
  47. }
  48. return null;
  49. }
  50. public String getUserName() {
  51. return userName;
  52. }
  53. public void setUserName(String userName) {
  54. this.userName = userName;
  55. }
  56. public String getPwd() {
  57. return pwd;
  58. }
  59. public void setPwd(String pwd) {
  60. this.pwd = pwd;
  61. }
  62. public String getVerifyCode() {
  63. return verifyCode;
  64. }
  65. public void setVerifyCode(String verifyCode) {
  66. this.verifyCode = verifyCode;
  67. }
  68. public String getAjax() {
  69. return ajax;
  70. }
  71. public void setAjax(String ajax) {
  72. this.ajax = ajax;
  73. }
  74. }

以上为登录测试代码(Struts2),在以上示例中,如果判断为ajax!=null成立,那么一定会报如题所示的错误,原因就是:if子句里已经做了一次response,在writer.close();的时候,本次response已经完成;但是紧接着在return SUCCESS;的时候,相当于又做了一次response,所以就出错了~

类似的错误也会出现于以下代码中:

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  2. throws ServletException, IOException {
  3. Writer writer = response.getWriter();
  4. writer.write("Hello");
  5. writer.flush();
  6. writer.close();
  7. response.sendRedirect("http://blog.csdn.net/baiyanglu/article/details/8076104");
  8. }

出现本错误后,web前端能够接收到第一次response的内容(就是说,挂电话之前说的话,我还是可以听到的,挂电话后讲的,当然听不到咯~),不会报错,只会在后台显示出错了

以上,转自http://www.cnblogs.com/wang3680/p/2c5f28ecfb8c2e2772474f3fab4d771c.html

Cannot call sendError() after the response has been committed - baiyangliu的更多相关文章

  1. Cannot call sendError() after the response has been committed - baiyangliu - 博客频道 - CSDN.NET

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  2. 报错:java.lang.IllegalStateException: Cannot call sendError() after the response has been committed(待解答)

    严重: Servlet.service() for servlet [default] in context with path [/20161101-struts2-1] threw excepti ...

  3. java.lang.IllegalStateException: Cannot call sendError() after the response has been committed

    http://blog.csdn.net/chenghui0317/article/details/9531171 —————————————————————————————————————————— ...

  4. java.lang.IllegalStateException: Cannot call sendError() after the response has been committed解读

    源代码: @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Ob ...

  5. Cannot call sendError() after the response has been committed(filter问题)

    就是因为执行了filter的dofilter方法中 chain.doFilter(request,response)了 执行了两遍 if(){}else{chain.doFilter(request, ...

  6. java.lang.IllegalStateException: Cannot call sendError() after the response has been committe

    1.问题描述 严重: Servlet.service() for servlet [default] in contextwith path [/OxygenCloud] threw exceptio ...

  7. [Java][Servlet] Cannot call sendRedirect() after the response has been committed

    做一个Login Demo的时候,写了如下代码: protected void doPost(HttpServletRequest request, HttpServletResponse respo ...

  8. Cannot call sendRedirect() after the response has been committed的解决办法

    做一个Login Demo的时候,写了如下代码: protected void doPost(HttpServletRequest request, HttpServletResponse respo ...

  9. Cannot forward after response has been committed

    项目:蒙文词语检索 日期:2016-05-01 提示:Cannot forward after response has been committed 出处:request.getRequestDis ...

随机推荐

  1. java static class 静态类

    一般情况下是不可以用static修饰类的.如果一定要用static修饰类的话,通常static修饰的是匿名内部类. 在一个类中创建另外一个类,叫做成员内部类.这个成员内部类可以静态的(利用static ...

  2. Crystal Reports 版权疑问

    以前一直以为Crystal Reports是微软公司的产品,由于最近公司项目用到Crystal Reports,花了点时间研究了下它,才发现其实不然. 历史: 最开始的开发公司名为Crystal Se ...

  3. js 日期格式化函数

    直接上代码: // 日期格式化函数 // yyyy/MM/dd hh:mm:ss SSS ⇒ "2017/05/16 09:24:20 850" //"yyyy/M/d ...

  4. sql sever跨数据库复制数据的方法

    1,用Opendatasource系统函数 详细的用法已经注释在sql代码中了.这个是在sqlserver到sqlserver之间的倒数据.2005,2008,2012应该都是适用的. --从远程服务 ...

  5. svn 备份脚本

    [root@hm-vpnserver-196 ~]# cat /root/svnback.sh #!/bin/bashtt=$(ls /home/svndata/) for i in $ttdo mk ...

  6. Navi.Soft31.WinForm框架(含下载地址)

    1概述 1.1应用场景 尽管互联网高速发展,互联网软件也随之越来越多,但桌面应用程序在某些领域中还是不可替代,如MIS,ERP,CRM等软件产品,同时,这类软件均包括一些通用的功能,如:与数据库操作, ...

  7. ClassNotFoundException和NoClassDefFoundError的解决办法

    程序在其他手机都没有问题,但在刷到版本稍微较低的平板或手机上时就会直接闪退,并报出以下异常: java.lang.RuntimeException: Unable to instantiate act ...

  8. 从Java开发者的视角解释JavaScript

    我们无法在一篇博文里解释JavaScript的所有细节.如果你正或多或少地涉及了web应用程序开发,那么,我们的Java工具和技术范围报告揭示了,大多数(71%)Java开发者被归到了这一类,只是你对 ...

  9. 关于Unity中蒙皮网格和布料的使用

    所以物体的要绘制出来就必须要有网格组件+材质属性,如果还需要其他特效或丰富内容的话,还可以再加组件. 蒙皮网格和布料 1: 例如要模拟衣服,随风摆动,模拟布料需要用到蒙皮网格和布料;2: 蒙皮网格可以 ...

  10. Ext3.4实现增删查改(form版)

    var TaskPolicyStore = new Ext.data.JsonStore( {    autoLoad : false,    url : 'PolicyServlet?method= ...