当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. C语言 · 求arccos值

    算法提高 7-2求arccos值   时间限制:10.0s   内存限制:256.0MB      问题描述 利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范围是[- ...

  2. hadoop3.0.0测验

    下载地址: hadoop: http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-3.0.0/ 准备工作: 1.master节点与其他节点需要建 ...

  3. IE兼容性视图设置

    问题: 页面 http://course.upol.cn/lx/jzjjygl/index.html 的课程学习中课程打不开 看了代码是有浏览器版本要求,IE9以上无法访问 解决办法: 1. 在IE设 ...

  4. R语言 ggplot2 画平滑图

    library(splines) library(ggplot2) dt1 <- structure(list(Age = structure(c(1L, 1L, 1L, 1L, 1L, 1L, ...

  5. [hadoop读书笔记] 第五章 MapReduce工作机制

    P205 MapReduce的两种运行机制 第一种:经典的MR运行机制 - MR 1 可以通过一个简单的方法调用来运行MR作业:Job对象上的submit().也可以调用waitForCompleti ...

  6. Writing a Reusable Custom Control in WPF

    In my previous post, I have already defined how you can inherit from an existing control and define ...

  7. export Jar from eclipse (总结)

    sourceforge 的源码网址 :https://sourceforge.net/projects/fjep/files/fatjar/ <span style="margin:0 ...

  8. Mac和Linux下pip更换源

    cd ~mkdir .pip vim .pip/pip.conf 在pip.conf中写入 [global]timeout = 6000index-url = https://pypi.tuna.ts ...

  9. 打开应用中SQLite文件的方法

    1.先找到sdk中的platform-tools文件夹下的adb.exe 2.打开dos命令窗口依次输入 :adb shell  →  sqlite3 /data/data/com.example.s ...

  10. 【转】【Android】Android Studio打包全攻略

    项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件).1. 创建签名文件2. 填写好签名参数3. 生成APK注意:签名的密码和密匙的密码注意保管,不要忘 ...