当前位置: 首页 > news >正文

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

http://qify.iteye.com/blog/747842

——————————————————————————————————————————————————

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

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


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

_jspService(HttpServletRequest request, HttpServletResponse response)

 

的最后
有一段这样的代码

finally {
      if (_jspxFactory != null) 
          _jspxFactory.releasePageContext(_jspx_page_context);
}

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

out.clear();
out = pageContext.pushBody();

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

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

如果写文件是在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();

 

 

 

 

 

 

 

相关文章:

  • spring boot下thymeleaf全局静态变量配置
  • ajax提交数据处理总结
  • django.http.response中HttpResponse 子类
  • SpringMVC三种异常处理方式
  • .NET 常见的偏门问题
  • CentOS6.4 安装LVS-RRD监控LVS
  • java8集合--LinkedList纯源码
  • 函数:递归是神马 - 零基础入门学习Python022
  • OSS控制台新增函数计算处理事件入口
  • 抽象类和接口
  • ABP理论学习之SignalR集成
  • Eclipse Java EE IDE 创建 Dynamic Web project问题
  • 集成第三方接口的技巧总结
  • 开始VS 2012 中LightSwitch系列的第2部分:感受关爱——定义数据关系
  • 在左上角倾斜四十五度显示的TextView
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 78. Subsets
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java反射-动态类加载和重新加载
  • java正则表式的使用
  • Java知识点总结(JavaIO-打印流)
  • Joomla 2.x, 3.x useful code cheatsheet
  • mockjs让前端开发独立于后端
  • Next.js之基础概念(二)
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python学习之路13-记分
  • Quartz初级教程
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Webpack入门之遇到的那些坑,系列示例Demo
  • Web设计流程优化:网页效果图设计新思路
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从伪并行的 Python 多线程说起
  • 观察者模式实现非直接耦合
  • 简单数学运算程序(不定期更新)
  • 前端学习笔记之观察者模式
  • 前嗅ForeSpider中数据浏览界面介绍
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 入手阿里云新服务器的部署NODE
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 在electron中实现跨域请求,无需更改服务器端设置
  • python最赚钱的4个方向,你最心动的是哪个?
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • !$boo在php中什么意思,php前戏
  • $(selector).each()和$.each()的区别
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • **PHP分步表单提交思路(分页表单提交)
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 中的轻量级线程安全