`
jessdy
  • 浏览: 61290 次
  • 性别: Icon_minigender_1
  • 来自: 上海虹口区
社区版块
存档分类
最新评论

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

    博客分类:
  • JSP
阅读更多
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内的所有空格和回车符号所有都删除掉),

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

out.clear();
out = pageContext.pushBody();


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


<% @ page   import = " java.awt.*,java.awt.image.*,java.util.*,javax.imageio.* "   %> 
<% @ page  import = " java.io.OutputStream "   %> 
<%! 
Color getRandColor( int  fc, int  bc){
Random random  =   new  Random();
if (fc > 255 ) fc = 255 ;
if (bc > 255 ) bc = 255 ;
int  r = fc + random.nextInt(bc - fc);
int  g = fc + random.nextInt(bc - fc);
int  b = fc + random.nextInt(bc - fc);
return   new  Color(r,g,b);
}
%> 
<% 
try {
response.setHeader( " Pragma " , " No-cache " );
response.setHeader( " Cache-Control " , " no-cache " );
response.setDateHeader( " Expires " ,  0 );
int  width = 60 , height = 20 ;
BufferedImage image  =   new  BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
OutputStream os = response.getOutputStream();
Graphics g  =  image.getGraphics();
Random random  =   new  Random();
g.setColor(getRandColor( 200 , 250 ));
g.fillRect( 0 ,  0 , width, height);

g.setFont( new  Font( " Times New Roman " ,Font.PLAIN, 18 ));
g.setColor(getRandColor( 160 , 200 ));
for  ( int  i = 0 ;i < 155 ;i ++ )
{
int  x  =  random.nextInt(width);
int  y  =  random.nextInt(height);
int  xl  =  random.nextInt( 12 );
int  yl  =  random.nextInt( 12 );
g.drawLine(x,y,x + xl,y + yl);
}
String sRand = "" ;
for  ( int  i = 0 ;i < 4 ;i ++ ){
String rand = String.valueOf(random.nextInt( 10 ));
sRand += rand;
g.setColor( new  Color( 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 ), 20 + random.nextInt( 110 )));
g.drawString(rand, 13 * i + 6 , 16 );
}
session.setAttribute( " rand " ,sRand);
g.dispose();

ImageIO.write(image,  " JPEG " ,os);
os.flush();
os.close();
os = null ;
response.flushBuffer();
out.clear();
out  =  pageContext.pushBody();
}
catch (IllegalStateException e)
{
System.out.println(e.getMessage());
e.printStackTrace();
} %> 


分享到:
评论

相关推荐

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

    在使用Tomcat 6服务器部署和运行Java Server Pages (JSP) 时,可能会遇到一个特定的异常:“getOutputStream() has already been called for this response”。该异常发生在尝试向响应对象中写入数据时,已经调用了...

    SpringMVC生成的验证码图片不显示问题及解决方法

    解决方法是设置浏览器不要缓存该图片,使用response.setHeader()方法设置Pragma、Cache-Control和Expires头信息。 知识点4: 404错误的解决方法 在本例中,验证码图片生成成功,但是却出现404错误。解决方法是检查...

    中文乱码解决方法(已验证).docx

    本文将详细解析中文乱码产生的原因以及针对request和response的解决方案。 一、基础知识 1. 字符编码:GBK是一种兼容GB2312的汉字编码标准,包含GB2312的所有字符,但GB2312编码的数据不一定能正确通过GBK解码。 2....

    android实现自动关机的具体方法代码.doc.docx

    "Android 实现自动关机的具体方法代码" Android 实现自动关机的具体方法代码是指使用 Android 操作系统实现...自动关机是 Android 设备的一种常见问题,了解自动关机的原因和解决方法对于保持设备的稳定运行非常重要。

    Feign发送Get请求时,采用POJO对象传递参数的最终解决方案.docx

    从异常信息来看,原本期望的是GET请求,但实际上服务器却接收到POST请求,从而抛出“方法不支持”的异常。 #### 问题根源 该问题的根本原因在于Feign默认使用的HTTP客户端实现——`HttpURLConnection`的行为。具体...

    解决Struts2中下载文件时点击取消按钮后台报错问题

    在处理文件下载时,应使用`ServletResponse`的`getOutputStream()`方法来获取输出流,然后通过这个流逐块写入文件内容。同时,我们需要监听客户端的断开连接情况,一旦发现客户端取消,立即关闭流并中断操作。 以下...

    Servlet中文乱码问题解决方案解析

    在本文中,我们将详细介绍Servlet中文乱码问题的出现原因、类型和解决方法。 一、出现乱码的原因 Servlet中文乱码问题的出现是由于浏览器默认使用UTF-8码表进行编码,而Servlet使用ISO-8859-1码表进行编码,传输和...

    乱码分析以及解决办法.docx

    本文将深入探讨乱码产生的原因以及如何解决。 首先,我们需要理解编码的基本概念。UTF-8是一种广泛使用的国际编码标准,它能表示世界上几乎所有的字符。GBK是中国大陆的中文编码,它包含了GB2312编码,但GB2312不能...

    解决Servlet中文乱码问题.docx

    总结来说,解决Servlet中文乱码问题主要涉及到对Request和Response的正确编码设置,以及确保浏览器能够识别并使用正确的编码解析数据。在实际开发中,将项目配置为统一使用UTF-8编码,通常可以避免大多数编码问题。...

    乱码问题解决

    本文将深入探讨如何在Servlet环境中解决乱码问题,确保数据正确无误地传输和显示。 ### Servlet中的乱码问题 #### 1. **理解字符编码** 在深入解决方案之前,首先需要了解字符编码的基本概念。字符编码是将字符...

    解决jfreechart中文乱码方案整理.doc

    解决JFreeChart中文乱码的方法主要集中在字体的配置和编码的处理两个方面。 #### 字体配置 字体配置是解决中文乱码最基本也是最有效的方法之一。 1. **使用系统字体** - 在Java环境中指定使用系统中已安装的支持...

    java.lang.IllegalStateException: OutputStream already obtain

    3. **重复调用getOutputStream()**:某些API可能会在内部缓存OutputStream,如果你多次调用获取OutputStream的方法,第二次及以后的调用可能会抛出此异常。 4. **框架或库的特定行为**:某些框架或库在处理...

    response中文乱码解决的代码

    首先,我们需要理解乱码产生的原因。通常,乱码出现是由于字符编码的不匹配,比如在服务器端和客户端之间,或者在HTTP请求和响应之间,没有正确地使用同一字符集。在处理文件下载时,如果文件名包含中文字符,服务器...

    解决了中文乱码的http的get和post请求demo

    首先,我们需要理解中文乱码问题产生的原因。当HTTP请求发送含有中文字符的数据时,如果编码格式不一致或未正确指定,接收端就可能无法正确解码,从而导致乱码。HTTP协议本身并不规定字符编码,而是依赖于Content-...

    Cannot forward after response has been committed

    通过仔细审查代码、优化逻辑和正确处理异常,可以有效地解决"Cannot forward after response has been committed"的问题。 关于提供的"filterTest"文件,可能是用于测试过滤器功能的示例代码。分析和理解这段代码...

    小小聊天程序代码——首次运行客户端可以向服务端发信息,不知道为什么之后相互就不能发信息了

    为了找出问题所在,需要仔细检查`XueLiangServer.java`和`XueLiangClient.java`中的代码,特别是涉及网络连接、数据读写和异常处理的部分。同时,查看日志或者使用调试工具可以帮助识别和解决问题。对于初学者来说,...

    解决不同浏览器下载时中文名乱码问题

    2. **异常处理**:在读取文件和写入输出流的过程中可能会遇到各种异常,需要适当增加异常处理逻辑,以保证程序的健壮性和用户体验。 3. **性能优化**:考虑到大文件的传输效率,可以考虑使用缓冲技术减少磁盘I/O操作...

    关于过大的占用内存的方法1

    在标题和描述中提到的问题是关于如何正确地使用`Runtime.getRuntime().exec()`方法来避免内存占用过大或导致程序挂起的情况。这个问题的核心在于理解和处理子进程的输入、输出和错误流。 首先,我们来看一下原始的`...

    安卓socket链接服务器接收数据APP大学生作业

    一旦连接建立,就可以通过Socket的getInputStream()和getOutputStream()获取输入流和输出流,实现数据的读写。 4. **数据传输**: 在描述中提到了传感器数据,这意味着可能涉及二进制或JSON格式的数据。通过输入流...

Global site tag (gtag.js) - Google Analytics