body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;}html, body{ }h1 { font-size:1.5em; font-weight:bold;}h2 { font-size:1.4em; font-weight:bold;}h3 { font-size:1.3em; font-weight:bold;}h4 { font-size:1.2em; font-weight:bold;}h5 { font-size:1.1em; font-weight:bold;}h6 { font-size:1.0em; font-weight:bold;}img { border:0; max-width: 100%;}blockquote { margin-top:0px; margin-bottom:0px;}table { border-collapse:collapse; border:1px solid #bbbbbb;}td { border-collapse:collapse; border:1px solid #bbbbbb;}Cannot call sendError() after the response has been committed - baiyangliu - 博客频道 - CSDN.NET

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

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

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

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

以上为登录测试代码(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.   
  8.             response.sendRedirect("http://blog.csdn.net/baiyanglu/article/details/8076104");  
  9.         }  
protected void doGet(HttpServletRequest request, HttpServletResponse response) 				throws ServletException, IOException {			Writer writer = response.getWriter();			writer.write("Hello");			writer.flush();			writer.close();			response.sendRedirect("http://blog.csdn.net/baiyanglu/article/details/8076104");		}

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

Cannot call sendError() after the response has been committed - baiyangliu - 博客频道 - CSDN.NET的更多相关文章

  1. Cannot call sendError() after the response has been committed - baiyangliu

    当response提交后,不能调用sendError(),什么意思? 出现这个错误,一定是多次response导致的.可以这么理解,承载客户端和服务器进行Http交互的Socket连接已经关闭了,而你 ...

  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. Windows GTK+ 环境搭建(详解)

    来源:http://blog.sina.com.cn/s/blog_a6fb6cc901017ygy.html Windows GTK+ 环境搭建 最近要做界面的一些东西,但是对微软提供的类库MFC不 ...

  2. 用sql server的sql语句算一个empty GUID

    在C#中得到一个empty GUID的方法是: Guid id= Guid.Empty; 那么在SQL Server Management Studio中怎样得到一个empty GUID呢? 方法有两 ...

  3. ng-option小解

    ng-option 有数组,对象两种情况,但目前只接触过数组 数组: label for value in array 分为一般数组和对象数组 一般数组: <select ng-model=&q ...

  4. Loadrunner脚本录制注意事项(七)

    1.手动走一遍被测业务,达到熟悉理解业务,注意是否和服务器有数据交互,为脚本是否需要关联做准备: 2.浏览器选择IE8/9较好,选择其他浏览器可能会有各种问题.(a.IE设置:内容-设置-去掉所有选项 ...

  5. C++的精髓——虚函数

    虚函数为了重载和多态的需要,在基类中是由定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原 ...

  6. JS的className,字体放大缩小

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  7. Java的动态加载及其安全性问题

    1.什么是动态加载 Class Loaders是动态加载Java类与Resource的一种机制.它支持Laziness,type-safe linkage,user-defined extensibi ...

  8. Leetcode389

    Find the Difference Given two strings s and t which consist of only lowercase letters. 给出两个字符串,s和t,都 ...

  9. Chapter 1 First Sight——9

    One of the best things about Charlie is he doesn't hover. 一件最好的事是查理兹他不在附近. He left me alone to unpac ...

  10. 使用JavaCV/OpenCV抓取并存储摄像头图像

    http://blog.csdn.net/ljsspace/article/details/6702178  分类: 图形图像(3)  版权声明:本文为博主原创文章,未经博主允许不得转载. 本程序通过 ...