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();
}%>
详细解决方案
tomcat5上jsp出现getOutputStream() has already been called for this response错误的原因和解决
热度:596 发布时间:2012-10-09 10:21:45.0
相关解决方案
- 求达人解决:tomcat5.5换到7.0 服务器下没有有关问题 本地测试出现如上代码
- 问上request.setCharacterEncoding()、response.setCharacterEncoding()的区别是什么
- response.write(session.getAttribute("BranchName")提示异常
- 帮忙看上 struts2上PrintWriter out = response.getWriter();出错
- @Context HttpServletRequest request,@Context HttpServletResponse response,该如何解决
- 验证码有关问题,webLogic中出现“response already committed”异常
- struts2+tomcat5.5+myeclipse6.5的404异常
- Response.AddHeader("Content-Disposition" "attachment; filename=" + file.Name+"xls");中文显示乱码解决方法
- 请教:jspsmartupload 下载文件出错提示:getOutputStream() has already been called 多谢
- weservice调用Server returned HTTP response code: 500 for URL解决方法
- Cannot create a session after the response has been committed,该怎么解决
- Cannot create a session after the response has been committed解决办法
- Struts2 的 Action 类里如何创建 session request response out 对象
- Server returned HTTP response code: 403 for URL如何解决
- tomcat5.5安装好后不能访问主页解决办法
- tomcat5.5.20下运行struts1.1出现有关问题
- response.sendRedirect 跳转的安全有关问题
- httpClient 错误 The server failed to respond with a valid HTTP response
- django rest framework 入门二——Request and Response
- Response.BinaryWrite((byte[])SqlReader.Item['icon']),该怎么处理
- ResPonse.Redrect("Defalut.aspx?id='<% Eval("id")>'")中?号代表什么意思,该如何处理
- Response.BinaryWrite((byte[])SqlReader.Item['icon']),该如何处理
- ResPonse.Redrect("Defalut.aspx?id='<% Eval("id")>'")中?号代表什么意思解决办法
- Response.BinaryWrite((byte[])SqlReader.Item['icon'])解决方法
- ResPonse.Redrect("Defalut.aspx?id='<% Eval("id")>'")中?号代表什么意思,该如何处理
- asp.net 中有没有相仿 execute "Response.Write 0" 这样的命令
- Response.Write("您无权访问!");Response.Redirect("login.aspx")
- Response.Write("<script>alert('')</script>"); 不起作用,该怎么处理
- Response.Redirect("")能不能跳转到原来的页面?该如何处理
- IE8 不认识输出流?context.Response.OutputStream?解决方法