解决getOutputStream() has already been called for this response_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 解决getOutputStream() has already been called for this response

解决getOutputStream() has already been called for this response

 2013/9/3 12:16:02  gqsunrise  程序员俱乐部  我要评论(0)
  • 摘要:getOutputStream()hasalreadybeencalledforthisresponse异常出现的原因和解决方法:jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好的原因。具体的原因:jsp编译成servlet之后在函数_jspService(HttpServletRequestrequest,HttpServletResponseresponse)的最后有一段这样的代码Java代码finally{if(_jspxFactory
  • 标签:for has 解决 all

getOutputStream() has already been called for this response异常出现的原因和解决方法

jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好的原因。


具体的原因:jsp编译成servlet之后在函数

_jspService(HttpServletRequest request, HttpServletResponse response)

?

的最后
有一段这样的代码

Java代码class="Apple-converted-space">? ?
  1. finally?{??
  2. ??????if?(_jspxFactory?!=?null)???
  3. ??????????_jspxFactory.releasePageContext(_jspx_page_context);??
  4. }??

?

这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和response.getOutputStream()相冲突的!所以会出现以上这个异常。然后当然是要提出解决的办法,其实挺简单的,在使用完输出流以后调用以下两行代码即可:

Java代码? ?
  1. out.clear();??
  2. out?=?pageContext.pushBody();??

?

最后这里是一个输出彩色验证码例子(这样的例子几乎随处可见)。

Java代码? ?收藏代码
  1. <%@?page??import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"?%>??
  2. <%@?page?import="java.io.OutputStream"?%>??
  3. <%!??
  4. Color?getRandColor(int?fc,int?bc){??
  5. Random?random?=?new?Random();??
  6. if(fc>255)?fc=255;??
  7. if(bc>255)?bc=255;??
  8. int?r=fc+random.nextInt(bc-fc);??
  9. int?g=fc+random.nextInt(bc-fc);??
  10. int?b=fc+random.nextInt(bc-fc);??
  11. return?new?Color(r,g,b);??
  12. }??
  13. %>??
  14. <%??
  15. try{??
  16. response.setHeader("Pragma","No-cache");??
  17. response.setHeader("Cache-Control","no-cache");??
  18. response.setDateHeader("Expires",?0);??
  19. int?width=60,?height=20;??
  20. BufferedImage?image?=?new?BufferedImage(width,?height,?BufferedImage.TYPE_INT_RGB);??
  21. OutputStream?os=response.getOutputStream();??
  22. Graphics?g?=?image.getGraphics();??
  23. Random?random?=?new?Random();??
  24. g.setColor(getRandColor(200,250));??
  25. g.fillRect(0,?0,?width,?height);??
  26. ??
  27. g.setFont(new?Font("Times?New?Roman",Font.PLAIN,18));??
  28. g.setColor(getRandColor(160,200));??
  29. for?(int?i=0;i<155;i++)??
  30. {??
  31. int?x?=?random.nextInt(width);??
  32. int?y?=?random.nextInt(height);??
  33. int?xl?=?random.nextInt(12);??
  34. int?yl?=?random.nextInt(12);??
  35. g.drawLine(x,y,x+xl,y+yl);??
  36. }??
  37. String?sRand="";??
  38. for?(int?i=0;i<4;i++){??
  39. String?rand=String.valueOf(random.nextInt(10));??
  40. sRand+=rand;??
  41. g.setColor(new?Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));??
  42. g.drawString(rand,13*i+6,16);??
  43. }??
  44. session.setAttribute("rand",sRand);??
  45. g.dispose();??
  46. ??
  47. ImageIO.write(image,?"JPEG",os);??
  48. ??
  49. //注意看以下几句的使用??
  50. os.flush();??
  51. os.close();??
  52. os=null;??
  53. response.flushBuffer();??
  54. out.clear();??
  55. out?=?pageContext.pushBody();??
  56. }??
  57. catch(IllegalStateException?e)??
  58. {??
  59. System.out.println(e.getMessage());??
  60. e.printStackTrace();??
  61. }%>??

?

发表评论
用户名: 匿名