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. PHP基本类型操作

    //关键字对大小写不敏感echo ('hello world!<br>');ECho ('hello world<br>');eCho ('hello world<br& ...

  2. 使用POI生成Excel文件,可以自动调整excel列宽

    //autoSizeColumn()方法自动调整excel列宽 importjava.io.FileOutputStream; importorg.apache.poi.hssf.usermodel. ...

  3. POJ 2031 Building a Space Station 最小生成树模板

    题目大意:在三维坐标中给出n个细胞的x,y,z坐标和半径r.如果两个点相交或相切则不用修路,否则修一条路连接两个细胞的表面,求最小生成树. 题目思路:最小生成树树模板过了,没啥说的 #include& ...

  4. UVA 1400 线段树

    input n m 1<=n,m<=500000 a1 a2 ... an |ai|<=1e9 m行查询 每行一对a b output 对于每对a b输出区间[a,b]中最小连续和x ...

  5. 重启oracle数据库的一次操作命令和alter日志。

    今天重启oracle数据库的命令和alter日志: oracle@NMSSERVER1:~> sqlplus '/as sysdba' SQL*Plus: Release 11.2.0.3.0 ...

  6. 基础-JavaScript中的事件

    在html中引入外部js方式: <html> <head> <script src="xxx.js"></script> </ ...

  7. [转]探究java IO之FileInputStream类

    使用FileInputStream类创建的InputStream对象可以用于从文件读取内容.两个常用的构造函数如下所示: ? 1 2 FileInputStream(String filePath) ...

  8. 查看log的方法

    adb logcat>1.txt adb shell cat /proc/atf_log/atf_log > atf_log 会保存在adb的本地文件. 还有一种是实时读取的方式: adb ...

  9. ZooKeeper概述

    1.Zookeeper概述 Zookeeper 是 Google 的 Chubby一个开源的实现,是 Hadoop 的分布式协调服务.它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置 ...

  10. 帝国cms文章内容tags关键词设置调用方法以及tags静态化

    说实话帝国cms用起来真的不好找一些功能,就比如说帝国cms的tag标签调用.需要注意的是帝国CMS文章的关键词和tags标签并非一码事,关键词标签是设置文章的关键词的,是用来给搜索引擎说明本篇文章的 ...