小谢叫我看一下01服务器上的医药平台,说抛了很多异常出来,看一下,大部分都是因为登录的时候验证码那个JSP页面抛出的getOutputStream() has already been called for this response。解决的办法,加上以下两行代码即可:
out.clear();
out = pageContext.pushBody();
原文件是这样写的:
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,java.io.*,javax.imageio.*" %>
<%!
//给定范围获得随机颜色
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);
}
%>
<%
//设置页面不缓存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
// 在内存中创建图象
int width=60, height=16;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
//生成随机类
Random random = new Random();
// 设定背景色
g.setColor(getRandColor(150,160));
g.fillRect(0, 0, width, height);
//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
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);
}
// 取随机产生的认证码(4位数字)
//String rand = request.getParameter("rand");
//rand = rand.substring(0,rand.indexOf("."));
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
session.setAttribute("CerCode",sRand);
// 图象生效
g.dispose();
// 输出图象到页面
OutputStream os=response.getOutputStream();
ImageIO.write(image, "JPEG", os);
%>
我改过的文件:
<%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,java.io.*,javax.imageio.*" %>
<%!
//给定范围获得随机颜色
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=16;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
//生成随机类
Random random = new Random();
// 设定背景色
g.setColor(getRandColor(150,160));
g.fillRect(0, 0, width, height);
//设定字体
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
//画边框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
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);
}
// 取随机产生的认证码(4位数字)
//String rand = request.getParameter("rand");
//rand = rand.substring(0,rand.indexOf("."));
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
session.setAttribute("CerCode",sRand);
// 图象生效
g.dispose();
// 输出图象到页面
OutputStream os=response.getOutputStream();
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();
}finally{
}
%>
问题解决(红色为加的代码)
分享到:
相关推荐
验证码出现getOutputStream() has already been called for this response错误解决
在Java Web开发中,"getOutputStream() has already been called for this response" 是一个常见的错误,通常出现在使用Servlet或JSP时。这个错误意味着在HTTP响应中,`getOutputStream()`已经被调用,然后尝试再次...
标签中的"源码"提示我们可能需要深入理解`ServletOutputStream` 和`InputStream` 的内部实现,包括它们如何与网络I/O交互,以及如何处理缓冲区和数据编码等问题。而"工具"可能指的是使用这些流类来构建各种服务器端...
纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....
在使用Tomcat 6服务器部署和运行Java Server Pages (JSP) 时,可能会遇到一个特定的异常:“getOutputStream() has already been called for this response”。该异常发生在尝试向响应对象中写入数据时,已经调用了...
在实际开发中,可能还会遇到如蓝牙连接稳定性、设备配对、权限请求等问题,这些问题需要根据具体情况进行优化处理。提供的"BluetoothSeriaPortDemo"是一个很好的起点,它已经实现了基本的蓝牙串口通信功能,开发者...
例如,代码`new PrintWriter(new OutputStreamWriter(resp.getOutputStream(), "utf-8"))`就是设置输出流的编码为UTF-8,以解决返回中文时可能出现的乱码问题。这里的`utf-8`是关键,它应与浏览器期望的编码一致。 ...
EasyExcel是一个基于Java的高性能、易用的Excel读写框架,它在处理大数据量的Excel时表现优秀,避免了内存溢出的问题。EasyExcel的核心设计理念是“按需加载”,即在读取Excel时只加载当前处理的数据行,极大地优化...
如果使用`response.getOutputStream()`,则不需要设置`response.setCharacterEncoding()`,因为它处理的是字节流而非字符流。 当使用`PrintWriter`输出中文字符串时,如果没有设置正确的字符编码,浏览器可能会按照...
try (OutputStream os = connection.getOutputStream()) { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8)); writer.write(getPostDataString(params)); ...
这里可能会遇到问题,因为如果在JSP中同时使用了`getWriter()`和`getOutputStream()`,会导致冲突。为避免这个问题,确保只使用一个,并在使用`getOutputStream()`前关闭`response.getWriter()`。 在`LOGIN.JSP`中...
本文将详细解析这个问题,并提供解决方案。 首先,我们需要理解Struts2中的文件下载原理。当用户请求下载文件时,服务器会读取文件内容并将其通过HTTP响应流返回给客户端。一旦客户端开始接收数据,即使用户取消...
通过Servlet的`HttpResponse`对象的`getOutputStream()`方法获取`ServletOutputStream`实例,然后设置合适的字符编码,如`ISO-8859-1`或`UTF-8`,以确保HTML页面中的中文字符能够正常显示。 总之,理解并掌握这些...
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // 发送登录信息 out.println("用户名"); out.println("密码"); // 接收服务器响应 String line; while ((line = in.readLine()) != ...
`HttpServletResponse`的`getOutputStream()`方法返回的`ServletOutputStream`默认使用系统默认编码。为了避免中文乱码,应创建一个`OutputStreamWriter`,指定合适的字符编码(如UTF-8),然后通过`write()`方法...
PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "GBK")); ``` 这里将输出流的编码设置为GBK,适用于处理中文字符。 ### 实践案例分析 假设在Servlet中接收到一个表单...