今天在第一次接触使用“验证码”功能时,在执行时出现了异常信息:
严重: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
。。。。
在网上搜索之后的解决方法是:
在生成验证码的jsp文件末尾添加两句话
out.clear();
out = pageContext.pushBody();
===========================================================================
查找的原文如下:
(http://hi.baidu.com/sihillver/blog/item/d384621e5612cdf01bd57630.html)
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()相冲突的!所以会出现以上这个异常。
采用方法很简单.在使用OutputStream输出流完成后,调用下面2个方法即可解决该问题:
out.clear();
out = pageContext.pushBody();
示例代码:
OutputStream os=response.getOutputStream();
os.write(new String("true "+"nowNum=" + nowNum+"===").getBytes());
os.flush();
os.close();
out.clear();
out = pageContext.pushBody();
----------------------------------------------------------------------------------------------------------------------------------
在jsp向页面输出图片的时候,使用response.getOutputStream()会有这样的提示:java.lang.IllegalStateException:getOutputStream() has already been called for this response,会抛出Exception
原因一:
JSP默认的输出流为PrintWriter ,即<% %>以外的东西所默认的输出方式,如果你尝试在JSP中使用ServletOutputStream就会引起错误.要嘛直接改用Servlet输出(复写service方法),要嘛删除除%><%中的任何东西(包括HTML标签,空格,回车等东西)应该就可以。
对于这样的情况应该这样来解决,删除%><%之间的所有内容包括空格和换行符,最后也要消除空格和换行符,最好再加上一句response.reset()。
原因二:
在J2EE的API参考里有这么个:
ServletResponse的getWriter()方法里会抛出这个异常,
IllegalStateException - if the getOutputStream method has already been called
for this response object
而它的getOutputStream()方法里会抛出这个异常.
IllegalStateException - if the getOutputStream method has already been called for this response object
并且两者的函数申明里都有这么样的一句
Either this method or getOutputStream() may be called to write the body, not both.
Either this method or getWriter() may be called to write the body, not both.
以上说明也解释了为什么在往页面中写入图片的时候要使用如下循环格式
OutputStream output=response.getOutputStream();
while((len=in.read(b)) >0)
{
output.write(b,0,len);
}
output.flush();
而不是把response.getOutputStream().write()放到循环体内
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/huiwolf007/archive/2008/03/15/2186172.aspx
分享到:
相关推荐
在Java Web开发中,"getOutputStream() has already been called for this response" 是一个常见的错误,通常出现在使用Servlet或JSP时。这个错误意味着在HTTP响应中,`getOutputStream()`已经被调用,然后尝试再次...
在使用Tomcat 6服务器部署和运行Java Server Pages (JSP) 时,可能会遇到一个特定的异常:“getOutputStream() has already been called for this response”。该异常发生在尝试向响应对象中写入数据时,已经调用了...
纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....
验证码出现getOutputStream() has already been called for this response错误解决
解决了getOutputStream() has already been called for this response. 并将产生验证码的逻辑从JSP页面中分离出来,单独写了一个类 便于重用。
3. **重复调用getOutputStream()**:某些API可能会在内部缓存OutputStream,如果你多次调用获取OutputStream的方法,第二次及以后的调用可能会抛出此异常。 4. **框架或库的特定行为**:某些框架或库在处理...
【JSP验证码(Servlet)详解】 验证码是一种常用的安全机制,用于防止自动化的恶意程序,如机器人,进行非法操作。在Web开发中,JSP(JavaServer Pages)与Servlet结合使用可以实现动态生成并验证验证码的功能。这...
解决“Cannot forward after response has been committed”的方法包括: 1. **检查和修正逻辑**:确保在请求处理的任何阶段,一旦响应被提交,就不再进行转发或重定向。 2. **使用try-catch-finally**:在可能抛出...
### jsp验证码——数字 #### 知识点详解 ##### JSP 验证码实现原理与过程 在本文档中,我们关注一个基于JavaServer Pages (JSP) 的数字验证码生成示例。此示例主要涉及到JSP页面的配置、Java图形处理库的使用以及...
本文将深入探讨JSP环境下的验证码实现,以及如何通过源码学习验证码的生成与验证。 ### 1. 验证码的基本原理 验证码的核心思想是生成一段随机且难以被机器识别的文字或图像,然后由用户手动输入,服务器端验证输入...
**JSP验证码登录程序详解** 验证码(CAPTCHA)是一种用于防止自动机器人或恶意脚本进行非法操作的安全机制,常用于用户登录、注册等场景。在JSP(Java Server Pages)中,结合Servlet实现验证码功能,可以有效提升...
总的来说,JSP生成的数字验证码结合了Java的强大功能和网页的交互性,提供了一种简单而有效的用户验证方法。在开发过程中,确保验证码的安全性和用户体验是至关重要的。通过对验证码的不断刷新和复杂化设计,我们...
**JSP验证码(简单版)** 验证码是一种常用的安全机制,用于防止自动机器人或者恶意脚本在网站上进行非法操作,如注册、登录、发布信息等。JSP(Java Server Pages)验证码是基于Java技术实现的一种网页验证码。在...
### jsp用户登录验证码知识点详解 #### 一、概述 在Web应用开发中,为了防止自动化工具或恶意脚本对登录系统的频繁尝试,通常会在登录界面加入验证码功能。验证码(CAPTCHA)是一种用来区分人与计算机的技术手段。...
以下是一个简单的JSP数字验证码的实现方法: 首先,我们来看一下JSP的基本结构。`@%>` 和 `是JSP中的脚本元素,它们分别用于执行Java代码和输出Java表达式的值。在这个例子中,我们主要使用了`@%>`来编写Java代码。...
response.getOutputStream().write(imageBytes); %> ``` 在HTML页面中,你可以这样展示验证码: ```html <img id="captchaImg" src="Code.jsp" alt="验证码"> ``` 然后在提交表单的按钮点击事件中,将输入的验证码...
JSP可以使用`response.setContentType()`来设置内容类型,并使用`response.getOutputStream().write()`将图片数据写入输出流。 在提供的文件“CheckImage”中,很可能包含了实现这些步骤的JSP源代码。可能的代码...
在本教程中,我们将探讨如何使用Java Server Pages (JSP)来实现一个简单的验证码功能,同时解决可能出现的`getOutStream()`相关问题。 首先,验证码的目的是确保用户是真实的,而不是自动化程序。它通常要求用户...