getOutputStream()异常的原因和解决方法

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

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

具体的原因就是
在tomcat中jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后
有一段这样的代码
finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
这里是在释放在jsp中使用的对象,会调用response.getWriter(),因为这个方法是和
response.getOutputStream()相冲突的!所以会出现以上这个异常。

然后当然是要提出解决的办法,其实挺简单的(并不是和某些朋友说的那样--
将jsp内的所有空格和回车符号所有都删除掉),

在使用完输出流以后调用以下两行代码即可:

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

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


Java代码 复制代码
  1. <%@pageimport="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*"%>
  2. <%@pageimport="java.io.OutputStream"%>
  3. <%!
  4. ColorgetRandColor(intfc,intbc){
  5. Randomrandom=newRandom();
  6. if(fc>255)fc=255;
  7. if(bc>255)bc=255;
  8. intr=fc+random.nextInt(bc-fc);
  9. intg=fc+random.nextInt(bc-fc);
  10. intb=fc+random.nextInt(bc-fc);
  11. returnnewColor(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. intwidth=60,height=20;
  20. BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  21. OutputStreamos=response.getOutputStream();
  22. Graphicsg=image.getGraphics();
  23. Randomrandom=newRandom();
  24. g.setColor(getRandColor(200,250));
  25. g.fillRect(0,0,width,height);
  26. g.setFont(newFont("TimesNewRoman",Font.PLAIN,18));
  27. g.setColor(getRandColor(160,200));
  28. for(inti=0;i<155;i++)
  29. {
  30. intx=random.nextInt(width);
  31. inty=random.nextInt(height);
  32. intxl=random.nextInt(12);
  33. intyl=random.nextInt(12);
  34. g.drawLine(x,y,x+xl,y+yl);
  35. }
  36. StringsRand="";
  37. for(inti=0;i<4;i++){
  38. Stringrand=String.valueOf(random.nextInt(10));
  39. sRand+=rand;
  40. g.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
  41. g.drawString(rand,13*i+6,16);
  42. }
  43. session.setAttribute("rand",sRand);
  44. g.dispose();
  45. ImageIO.write(image,"JPEG",os);
  46. os.flush();
  47. os.close();
  48. os=null;
  49. response.flushBuffer();
  50. out.clear();
  51. out=pageContext.pushBody();
  52. }
  53. catch(IllegalStateExceptione)
  54. {
  55. System.out.println(e.getMessage());
  56. e.printStackTrace();
  57. }%>

来自:http://jessdy.javaeye.com/blog/187448

  1. 原始代码:
  2. <%@pagecontentType="text/html;charset=GBK"%>
  3. <%@pageautoFlush="false"%>
  4. <%@pageimport="java.sql.*"%>
  5. <%@pageimport="java.io.*"%>
  6. <%@pageimport="java.util.*"%>
  7. <%@pageimport="java.awt.*"%>
  8. <%@pageimport="java.awt.image.*"%>
  9. <%@pageimport="com.sun.image.codec.jpeg.*"%>
  10. <%@pageimport="com.sun.image.codec.jpeg.*"%>
  11. <%@pageimport="com.csland.common.util.*"%>
  12. <%!
  13. publicvoidnoImg(ServletOutputStreamoutStream){
  14. try{
  15. intwidth=80,height=50;
  16. BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  17. Graphicsg=image.getGraphics();
  18. //以下填充背景颜色
  19. g.setColor(Color.WHITE);
  20. g.fillRect(0,0,width,height);
  21. g.setColor(Color.ORANGE);
  22. g.drawRect(0,0,width-1,height-1);
  23. Stringrandom="random";
  24. //以下设置前景色
  25. g.setColor(Color.BLACK);
  26. g.drawString("没有签名图",0,25);
  27. g.dispose();
  28. //
  29. JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(outStream);
  30. encoder.encode(image);
  31. outStream.flush();
  32. //outStream.close();
  33. }catch(Exceptione){
  34. Log.fetal("atnoImginsig2.jsp:/n"+e);
  35. }
  36. }
  37. publicvoidnoImg(HttpServletResponseresponse){
  38. try{
  39. ServletOutputStreamoutStream=response.getOutputStream();
  40. noImg(outStream);
  41. }catch(Exceptione){
  42. Log.fetal("atnoImginsig2.jsp:/n"+e);
  43. }
  44. }
  45. %>
  46. <%
  47. out.clear();
  48. response.setContentType("image/jpeg");
  49. response.addHeader("pragma","NO-cache");
  50. response.addHeader("Cache-Control","no-cache");
  51. response.addDateHeader("Expries",0);
  52. intid=StrUtil.StrToInt(request.getParameter("id"));
  53. if(id<=0)
  54. {
  55. noImg(response);
  56. }
  57. else
  58. {
  59. java.sql.Connectionconn=null;
  60. java.sql.Statementstmt=null;
  61. java.sql.ResultSetlobDetails=null;
  62. try{
  63. conn=DBUtil.getConn();
  64. stmt=conn.createStatement();
  65. lobDetails=stmt.executeQuery(
  66. "SELECTSignatureFROMOZ_Member"+
  67. "WHEREMemberID="+id+"");
  68. if(lobDetails.next()){
  69. BlobmapBlob=lobDetails.getBlob(1);
  70. if(mapBlob!=null){
  71. InputStreamblobStream=mapBlob.getBinaryStream();
  72. Log.debug("blobStream:"+blobStream);
  73. ServletOutputStreamoutStream=response.getOutputStream();
  74. byte[]buffer=newbyte[10*1024];
  75. intnbytes=0;
  76. intallBytes=0;
  77. while((nbytes=blobStream.read(buffer))!=-1){
  78. outStream.write(buffer,0,nbytes);
  79. allBytes+=nbytes;
  80. }
  81. Log.debug("allBytes:"+allBytes);
  82. if(allBytes<1){
  83. Log.debug("allBytes2:"+allBytes);
  84. noImg(outStream);
  85. }else{
  86. outStream.flush();
  87. //outStream.close();
  88. }
  89. blobStream.close();
  90. }else{
  91. noImg(response);
  92. }
  93. }else{
  94. noImg(response);
  95. }
  96. }
  97. catch(Exceptione){
  98. Log.fetal(e);
  99. }
  100. finally{
  101. try{lobDetails.close();}catch(Exceptione){}
  102. try{stmt.close();}catch(Exceptione){}
  103. try{conn.close();}catch(Exceptione){}
  104. }
  105. }
  106. %>
  107. 修改后的代码===============byyanleigis
  108. <%@pagecontentType="text/html;charset=GBK"%>
  109. <%@pageautoFlush="false"%>
  110. <%@pageimport="java.sql.*"%>
  111. <%@pageimport="java.io.*"%>
  112. <%@pageimport="java.util.*"%>
  113. <%@pageimport="java.awt.*"%>
  114. <%@pageimport="java.awt.image.*"%>
  115. <%@pageimport="com.sun.image.codec.jpeg.*"%>
  116. <%@pageimport="com.sun.image.codec.jpeg.*"%>
  117. <%@pageimport="com.csland.common.util.*"%>
  118. <%!
  119. publicvoidnoImg(ServletOutputStreamoutStream){
  120. try{
  121. intwidth=80,height=50;
  122. BufferedImageimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  123. Graphicsg=image.getGraphics();
  124. //以下填充背景颜色
  125. g.setColor(Color.WHITE);
  126. g.fillRect(0,0,width,height);
  127. g.setColor(Color.ORANGE);
  128. g.drawRect(0,0,width-1,height-1);
  129. Stringrandom="random";
  130. //以下设置前景色
  131. g.setColor(Color.BLACK);
  132. g.drawString("没有签名图",0,25);
  133. g.dispose();
  134. //
  135. JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(outStream);
  136. encoder.encode(image);
  137. outStream.flush();
  138. outStream.close();
  139. }catch(Exceptione){
  140. Log.fetal("atnoImginsig2.jsp:/n"+e);
  141. }
  142. }
  143. publicvoidnoImg(HttpServletResponseresponse){
  144. try{
  145. ServletOutputStreamoutStream=response.getOutputStream();
  146. noImg(outStream);
  147. }catch(Exceptione){
  148. Log.fetal("atnoImginsig2.jsp:/n"+e);
  149. }
  150. }
  151. %>
  152. <%
  153. out.clear();
  154. out=pageContext.pushBody();
  155. response.setContentType("image/jpeg");
  156. response.addHeader("pragma","NO-cache");
  157. response.addHeader("Cache-Control","no-cache");
  158. response.addDateHeader("Expries",0);
  159. intid=StrUtil.StrToInt(request.getParameter("id"));
  160. if(id<=0)
  161. {
  162. noImg(response);
  163. }
  164. else
  165. {
  166. java.sql.Connectionconn=null;
  167. java.sql.Statementstmt=null;
  168. java.sql.ResultSetlobDetails=null;
  169. try{
  170. conn=DBUtil.getConn();
  171. stmt=conn.createStatement();
  172. lobDetails=stmt.executeQuery(
  173. "SELECTSignatureFROMOZ_Member"+
  174. "WHEREMemberID="+id+"");
  175. if(lobDetails.next()){
  176. BlobmapBlob=lobDetails.getBlob(1);
  177. if(mapBlob!=null){
  178. InputStreamblobStream=mapBlob.getBinaryStream();
  179. Log.debug("blobStream:"+blobStream);
  180. ServletOutputStreamoutStream=response.getOutputStream();
  181. byte[]buffer=newbyte[10*1024];
  182. intnbytes=0;
  183. intallBytes=0;
  184. while((nbytes=blobStream.read(buffer))!=-1){
  185. outStream.write(buffer,0,nbytes);
  186. allBytes+=nbytes;
  187. }
  188. Log.debug("allBytes:"+allBytes);
  189. if(allBytes<1){
  190. Log.debug("allBytes2:"+allBytes);
  191. noImg(outStream);
  192. }else{
  193. outStream.flush();
  194. //outStream.close();
  195. }
  196. blobStream.close();
  197. }else{
  198. noImg(response);
  199. }
  200. }else{
  201. noImg(response);
  202. }
  203. response.flushBuffer();
  204. out.clear();
  205. out=pageContext.pushBody();
  206. }
  207. catch(Exceptione){
  208. Log.fetal(e);
  209. }
  210. finally{
  211. try{lobDetails.close();}catch(Exceptione){}
  212. try{stmt.close();}catch(Exceptione){}
  213. try{conn.close();}catch(Exceptione){}
  214. }
  215. }
  216. %>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用和的信息,当你在jsp中使用response.getOutputStream()方法时,如果该方法已经被调用过一次,就会出现IllegalStateException异常。这是因为在同一个响应对象中,只能调用一次getOutputStream()方法。一旦调用了该方法,就无法再调用getWriter()方法。这是因为响应对象只能使用一种输出流来发送数据,要么是OutputStream,要么是Writer。 要解决这个问题,你可以检查你的代码,确保在调用getOutputStream()方法之前没有调用过getWriter()方法。如果你需要向页面输出文本内容,可以使用getWriter()方法来代替getOutputStream()方法。如果你确实需要同时输出文本和图片,你可以将图片转换为字节数组或者base64编码的字符串,然后使用getOutputStream()方法来发送图片数据。这样就可以避免调用getOutputStream()方法两次导致的异常123 #### 引用[.reference_title] - *1* *2* [getOutputStream() has already been called for this response异常原因解决方法[转]](https://blog.csdn.net/weixin_34377065/article/details/94254180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] - *3* [getOutputStream() has already been called for this response 从了解到解决](https://blog.csdn.net/TimerBin/article/details/90295451)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值