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

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

阅读更多
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

<%@pagecontentType="text/html;charset=gb2312"%>
<%@pageimport="java.awt.*"%>
<%@pageimport="java.awt.image.*"%>
<%@pageimport="java.util.*"%>
<%@pageimport="javax.imageio.*"%>
<%!
ColorgetRandColor(
intfc,intbc)...{//给定范围获得随机颜色
Randomrandom=newRandom();
if(fc>255)fc=255;
if(bc>255)bc=255;
intr=fc+random.nextInt(bc-fc);
intg=fc+random.nextInt(bc-fc);
intb=fc+random.nextInt(bc-fc);
returnnewColor(r,g,b);

}

%>
<%
//在内存中创建图象
intwidth=80,height=20;
BufferedImageimage
=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

//获取图形上下文
Graphicsg=image.getGraphics();

//生成随机类
Randomrandom=newRandom();

//设定背景色
g.setColor(getRandColor(200,250));
g.fillRect(
0,0,width,height);

//设定字体
g.setFont(newFont("TimesNewRoman",Font.PLAIN,18));

//画边框
//g.setColor(newColor());
//g.drawRect(0,0,width-1,height-1);

//随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
g.setColor(getRandColor(160,200));
for(inti=0;i<155;i++)
...{
intx=random.nextInt(width);
inty=random.nextInt(height);
intxl=random.nextInt(12);
intyl=random.nextInt(12);
g.drawLine(x,y,x
+xl,y+yl);
}


//取随机产生的认证码(5位数字)
StringsRand="";
for(inti=0;i<5;i++)...{
Stringrand
=String.valueOf(random.nextInt(10));
sRand
+=rand;
//将认证码显示到图象中
g.setColor(newColor(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
g.drawString(rand,13*i+6,16);
}


//将认证码存入SESSION
session.setAttribute("CertiCode",sRand);

//图象生效
g.dispose();

//设置页面不缓存
response.reset();
response.setHeader(
"Pragma","No-cache");
response.setHeader(
"Cache-Control","no-cache");
response.setDateHeader(
"Expires",0);
//输出图象到页面
ServletOutputStreamos=response.getOutputStream();
ImageIO.write(image,
"JPEG",os);
os.flush();
os.close();
os
=null;
response.flushBuffer();
out.clear();
out
=pageContext.pushBody();
%>
分享到:
评论

相关推荐

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

    在Java Web开发中,"getOutputStream() has already been called for this response" 是一个常见的错误,通常出现在使用Servlet或JSP时。这个错误意味着在HTTP响应中,`getOutputStream()`已经被调用,然后尝试再次...

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

    1.在tomcat6.0下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法  在tomcat6.0下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有...

    验证码出现getOutputStream()问题解决

    验证码出现getOutputStream() has already been called for this response错误解决

    java.lang.IllegalStateException: getOutputStream() has already解决办法

    纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....

    Cannot forward after response has been committed

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

    JSP彩色验证码

    解决了getOutputStream() has already been called for this response. 并将产生验证码的逻辑从JSP页面中分离出来,单独写了一个类 便于重用。

    handleStream ServletOutputStream out = response.getOutputStream(); InputStream i

    `response.getOutputStream()` 方法是Servlet API的一部分,它用于获取与HTTP响应关联的输出流对象。这个方法在服务器端处理请求时非常常见,尤其在构建动态网页时。 当我们处理一个HTTP请求时,服务器会创建一个`...

    JSP内置对象request和response.doc

    JSP内置对象request和response详解 JSP内置对象request和response是JSP开发中两个非常重要的对象,它们分别用于处理客户端请求和响应信息。在本文档中,我们将详细介绍request和response对象的功能和使用方法。 ...

    java.lang.IllegalStateException: OutputStream already obtain

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

    response jsp 中的重要知识点

    在Java Web开发中,`response.jsp`通常是指服务器端的响应页面,主要涉及Servlet和JSP(JavaServer Pages)技术。`response`对象是Servlet API中的一个关键组件,全称为`HttpServletResponse`,它用于构建并发送回...

    JSP文件下载的解决方法

    标题:JSP文件下载的解决方法 描述:本文将探讨并提供多种方法来解决JSP文件下载的问题,重点介绍源代码级别的实现方案。 在Web开发中,文件下载是常见的需求之一,尤其在企业级应用中,用户可能需要下载报告、...

    HttpServletRequest-response方法总结

    * 在使用Request和Response对象时,需要注意方法的调用顺序,防止出现异常。 ServletRequest和ServletResponse是Servlet编程中两个最重要的接口,它们提供了对HTTP请求和响应的控制和处理。正确地使用...

    response设置的实例源码

    2. 转发:`RequestDispatcher`的`forward(ServletRequest request, ServletResponse response)`方法可以在服务器端将请求转发到另一个资源。这不会改变客户端的URL。 ```java RequestDispatcher dispatcher = ...

    jsp内置对象课件,维护对象和增加和删除对象属性

    它的类型是`javax.servlet.jsp.JspWriter`,提供了`print()`和`println()`等方法用于输出数据,以及管理缓冲区的方法如`close()`、`clearBuffer()`、`clear()`、`getRemaining()`和`flush()`等,便于控制输出流和...

    JAVAEE中Servlet实例Response与Request对象方法调用范例

    本实例主要探讨Servlet中的两个关键对象:HttpServletRequest(Request)和HttpServletResponse(Response),它们是Servlet API的核心组成部分,用于处理HTTP请求和构建响应。 Request对象是用于获取客户端发送的...

    fileupload jsp上传下载组件和使用方法

    为了保证程序的健壮性,需要对可能出现的异常进行捕获和处理,例如文件大小超出限制、文件上传失败等。 综上所述,`FileUpload` JSP上传下载组件提供了处理文件上传和下载的强大工具,通过合理的集成和使用,可以...

    filter 修改jsp servlet response返回的内容

    本篇我们将深入探讨如何使用`filter`来修改JSP(JavaServer Pages)和servlet生成的`response`内容。 首先,让我们理解`filter`的基本概念。根据Java Servlet规范,`Filter`接口定义了一系列方法,如`doFilter()`,...

    jsp生成静态页面的方法

    ### jsp生成静态页面的方法 在Web开发领域中,动态页面...总之,利用JSP和Servlet技术实现动态页面到静态页面的转换是一种实用且高效的解决方案。它不仅有助于提升网站性能,还能增强搜索引擎对网站内容的抓取效果。

    JSP内置对象 request、response、out的应用

    ### JSP内置对象request、response、out的应用 在Java Server Pages (JSP)技术中,内置对象是开发者经常使用的工具之一。这些内置对象为开发者提供了处理客户端请求、响应和服务端输出的强大能力。本文将深入探讨三...

Global site tag (gtag.js) - Google Analytics