您的位置:首页 > 编程语言 > PHP开发

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

2014-03-11 14:22 411 查看
etOutputStream() has already been called for this response异常出现的原因和解决方法:

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

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

_jspService(HttpServletRequest request, HttpServletResponse response)

 

的最后

有一段这样的代码

Java代码  


finally {  

      if (_jspxFactory != null)   

          _jspxFactory.releasePageContext(_jspx_page_context);  

}  

 

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

Java代码  


out.clear();  

out = pageContext.pushBody();  

 

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

Java代码  


<%@ 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);  

f9d1
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();  

}%>  

 

 

如果写文件是在java类中实现,可参考如下代码:

Java代码  


FileOutputStream out = new FileOutputStream(file,true);  

out.write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF});//utf-8 bom  

out.write(content.getBytes(charset));  

out.close();  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐