验证码 getOutputStream() has already been called for this response异常的原因和解决方法

getOutputStream() has already been called for this response 错误解决 NULL 博文链接:https://javal.iteye.com/blog/1993903 立即下载

1.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 j=0;j<4;j++){
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*j+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();
}%>


如有不足之处,欢迎斧正!

2

getOutputStream() has already been called for this response问题的解决
在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()放到循环体内

在页面中直接写:
<body bgcolor="#ffffff">
<h1>
<%
response.getOutputStream();
%>
</h1>
</body>
将会出现错误消息如下:
java.lang.IllegalStateException: getOutputStream() has already been called for this response
org.apache.catalina.connector.Response.getWriter(Response.java:604)
org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)

tomcat6下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 主要介绍tomcat6下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法,需要的朋友可以参考下。 立即下载

相关推荐

美亚杯2023参赛全攻略:从检材下载到Veracrypt挂载的保姆级教程

本文提供美亚杯2023电子数据取证竞赛的完整参赛指南,重点解析从检材下载、Veracrypt挂载到实战取证的保姆级流程。针对新手常见误区,详细说明两套密码(ZIP解压密码与Veracrypt挂载密码)的区别与正确使用方法,并分享赛前环境搭建、赛中高效分析及赛后报告撰写的核心技巧,帮助参赛者系统备赛,规避基础错误。

y9z0a1b的博客 1080

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

一、背景说明 在tomcat的localhost.log日志中时长见到 getOutputStream() has already been called for this response 异常的身影,一直不知由于哪里原因导致异常的产生,此异常并不会影响前端客户正常使用。 二、认识异常 异常详情如下所示(部分代码): org.apache.catalina....

TimerBin的博客 9万+

Numpy快速入门(np)!看这一篇就够了

Numpy快速入门(np)!看这一篇就够了

weixin_74009895的博客 2679

getOutputStream() has already been called for this response

此异常一般发生在下载文件中出现,因调用了response.getOutputStream(),对文件进行了流式输出。但是出现了此异常并不影响文件的下载 此异常的解决方案: 1、如果需要有返回值,在方法上加@ResponseBody注解 2、不用给返回值,直接void就行了 问题发生的原因: 如果有返回值则判断是否需要走视图解析器ModelAndView,判断就看是否有@ResponseBody注解。 @ResponseBody将返回结果直接写入 HTTP response bod..

qq_39513256的博客 9792

SAP FI 提示没有为会计年度0 定义版本2025 GP626

SAP 错误 GP626 是一个常见的系统消息,通常表示某个会计年度的版本(如版本 0)未被定义或未激活。:在执行某些事务(如创建采购订单、过账凭证或维护成本中心)时,系统会检查相关版本是否已定义。的“Settings for Each Fiscal Year”界面中,选择一个已激活的会计年度。的“Settings for Each Fiscal Year”界面中,找到未激活的会计年度。:在控制范围(Controlling Area)中,未为指定的会计年度定义版本 0。如果没有,添加或复制现有年度的设置。

GAVIN 2493

OTFS从零开始11 10

未来的无线网络有望提供全球覆盖,因此需要支持在恶劣环境下的各种新兴应用,例如飞机上的移动通信(MCA)、低地球轨道(LEO)卫星通信、车对车(V2V)通信、高速铁路(HSR)通信、无人驾驶飞机(UAV)通信和水下声学通信(UAC)。在这些恶劣环境中的无线信道通常被视为对通信不友好,其特点是严重的延迟和多普勒扩散,以及有限的路径寿命等。这些不利于通信的特性使目前移动网络中广泛采用的正交频分复用(OFDM)调制的性能恶化。

qq_46009045的博客 9861

生成图片验证码jsp出现getOutputStream() has already been called for this response异常的原因和解决方法

    出现此错误一般都是在jsp中使用了输出流,没有妥善处理好的原因(我之前的文章也有此错误:JSP生成彩色验证码)。        具体的原因就是在jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后有一段这样的代码:    finally {        if

ray_1981的专栏 2774

SpringBoot4+Java21前后端分离架构项目脚手架

本文介绍了基于SpringBoot 4和Java 21的前后端分离项目架构方案。主要内容包括:1)采用Spring Security 7实现JWT无状态认证和RBAC权限控制;2)后端使用MyBatis-Plus简化数据库操作,前端采用Vue3+Pinia组合;3)详细的项目结构设计,推荐按业务模块分包;4)核心依赖配置和架构设计图,涵盖认证授权流程。该方案结合最新技术栈,提供了生产级的全链路实现,特别适合需要快速构建现代化Web应用的项目。

Hello, New World! 423

验证码 getOutputStream() has already been called for this response异常的原因和解决方法2

tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法在tomcat5下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等), 没有妥善处理好的原因。 具体的原因就是 在tomcat中jsp编译成servlet之后在函数_jspService(Http...

lehui2008的专栏 172

18、动态系统响应分析

本文系统地介绍了动态系统响应的分析方法,涵盖传递函数建模、特殊输入下的响应特性(如脉冲和阶跃响应)、终值与初值定理的应用、系统直流增益的计算,并深入探讨了一阶和二阶系统的时域特性。通过实例分析与MATLAB仿真,展示了不同参数对系统行为的影响。文章还总结了系统响应在控制设计与故障诊断中的实际应用,并展望了多变量、非线性及实时响应分析的未来研究方向。配合流程图,提供了清晰的系统分析与设计路径。

kite3的博客 144

RAP 值帮助实战:用 CDS 注解把 Fiori Elements 的输入体验做得又快又准

本文系统介绍了如何在SAP RAP应用中实现高效的值帮助(Value Help)功能。通过复用标准CDS View和自定义View Entity,开发者可以快速为字段添加弹窗选择、搜索和下拉框功能。文章详细讲解了三种核心实现方式:复用标准值帮助CDS View实现快速集成;构建自定义View Entity支持企业特定编码;利用搜索注解(@Search)和下拉框注解(@ObjectModel)优化用户体验。特别强调了文本显示、模糊搜索和小结果集下拉等实用技巧,并提供了可直接复用的国家代码值帮助示例。这些方法能

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 6466

生成图片验证码jsp出现getOutputStream() has already been called for this response异常的原因和解决方法...

出现此错误一般都是在jsp中使用了输出流,没有妥善处理好的原因 具体的原因就是在jsp编译成servlet之后在函数_jspService(HttpServletRequest request, HttpServletResponse response)的最后有一段这样的代码: finally { if (_jspxFactory != null) _jspxFactory.releas...

yangshen998 315

全网唯一OpenCyphal/UAVCAN教程(8)libcanard介绍

当Cyphal里,这个结构体代表一条完整的Cyphal消息,之后我们会根据metadata里提供的元信息,其实就是消息ID,调用对应的反序列化函数,将payload还原成具体的Cyphal消息。用于构造一个新的发送队列,原则上一个can物理接口需要分配一个发送队列,如果它们的MTU大小一致,是可以共用一条的。这个库不包含IO层,是平台无关的,意义是没有实现具体的数据收发,仅提供将发送出去的Cyphal消息转成can帧,以及将收到的can帧转成Cyphal消息。返回值是这条消息拆解成的can帧的数目。....

二进制君 2409

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

getOutputStream() has already been called for this response异常出现的原因和解决方法: jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好的原因。 具体的原因:jsp编译成servlet之后在函数 _jspService(HttpServletRequest request

huanglin02的专栏 3万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

解决getOutputStream() has already been called for this response异常办法

在打开http://localhost:8080/firsttest/login.jsp时系统报getOutputStream() has already been called for this response 这个异常.因为登陆的jsp页面用到了输出流response.getWriter(),所以在网上搜索了一下.原因是登陆页面的验证码输入框和jsp页的response的response.g

winer2008的专栏 2535

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

<br />文章分类:Java编程<br />getOutputStream() has already been called for this response异常出现的原因和解决方法:<br />jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好的原因。<br /><br />具体的原因:jsp编译成servlet之后在函数<br />_jspService(HttpServletRequest request, HttpServletResponse r

zhouzilong502086525的专栏 2217

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

问题:在打开http://localhost:8080/bertelsmann/login.jsp时系统报getOutputStream() has already been called for this response 这个异常.因为登陆的jsp页面用到了输出流response.getWriter(),所以在网上搜索了一下.原因是登陆页面的验证码输入框和jsp页的response的respo

阿布个人学习自留地 3856

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

tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法在tomcat5下jsp中出现此错误一般都是在jsp中使用了输出流(如输出图片验证码,文件下载等),没有妥善处理好的原因。具体的原因就是在tomcat中jsp编译成servlet之后在函数_jspService(HttpServle

Blog of Alex Wan 7037

java.lang.IllegalStateException: getOutputStream() has already been called for this response

1.问题描述:   在日常练习的时候遇见的错误,虽然页面可以顺利显示,但后台报错:(虽然不影响导出效果,但看到后台的异常,内心还是不舒服的) java.lang.IllegalStateException: getOutputStream() has already been called for this response 从字义上分析:getOutputStream()已经调用了这个响应,就是重复被调用引起的异常。 2.问题分析:   在tomcat下jsp出现该错误一般都是在使用了输出流(如...

rizon886的博客 3724

解决+解决思路:java.lang.IllegalStateException: getOutputStream() has already been called for this response

java.lang.IllegalStateException: getOutputStream() has already been called for this response 首先说明这个异常没有对使用功能造成影响,但是每次请求都会报出这个异常所以还是解决滴 会出现这个错误是因为我使用SpringBoot准备把kaptcha封装成工具类打算复用,当时使用到验证码的只是登陆和注册,但是使用验证码的场景还是很多,毕竟涉及到安全的问题,验证码还是很有用处的。 最先开始功能没问题感觉还是良好的,但是每.

一颗剽悍的种子的博客 8414
上一篇: java的构造方法
下一篇: SimpleDateFormat格式化日期
fancylovejava
博客等级 码龄16年 1052粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值