登录验证码代码,一个jsp,在Tomcat下没有问题,但放到weblogic下,每次请求都会报错:
java.io.IOException: response already committed
但使用没有问题。
作如下修改即可不报错:
加上response.reset();
Java代码 ?
// 图象生效 ??
g.dispose(); ?
//解决WebLogic下报错java.io.IOException: response already committed ?
response.reset(); ?
?注释:
Java代码 ?
// 输出图象到页面 ??
ImageIO.write(image, "JPEG", response.getOutputStream()); ?
//解决java.lang.IllegalStateException: getOutputStream() has already been called for this response ?
//WebLogic下要注释掉下面两句 ?
//out.clear(); ?
//out = pageContext.pushBody();?
实例代码(TOMCAT下面的正确代码)
<%@page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" pageEncoding="UTF-8" %>
<%!
? ? Color getRandColor(int cc,int bb)
? ? {
? ? ? ? Random random = new Random();
? ? ? ? if(cc>255) cc=255;
? ? ? ? if(bb>255) bb=255;
? ? ? ? int r=cc+random.nextInt(bb-cc);
? ? ? ? int g=cc+random.nextInt(bb-cc);
? ? ? ? int b=cc+random.nextInt(bb-cc);
? ? ? ? return new Color(r,g,b);
? ? } //获取随机颜色
%>
<%
? ? response.setHeader("Pragma","No-cache");
? ? response.setHeader("Cache-Control","no-cache");
? ? response.setDateHeader("Expires", 0);
?
? ? int width=80; //定义验证码图片的长度
? ? int height=30; //定义验证码图片的宽度
? ? BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
? ? 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 i_x = random.nextInt(width);
? ? ? ?int i_y = random.nextInt(height);
? ? ? ?int i_xl = random.nextInt(12);
? ? ? ?int i_yl = random.nextInt(12);
? ? ? ?g.drawLine(i_x,i_y,i_x+i_xl,i_y+i_yl);
? ? }
? ? //用线条画背景
?
? ? String s_Rand="";
? ? for (int i=0;i<4;i++)
? ? {
? ? ? ?String rand=String.valueOf(random.nextInt(10));
? ? ? ?s_Rand+=rand;
? ? ??
? ? ? ?g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
? ? ? ?g.drawString(rand,13*i+6,16);
? ? }
? ? //产生4位随机码?
?
? ? session.setAttribute("rand",s_Rand);
? ? //将验证码存入Session中
? ? g.dispose(); ?
? ? ImageIO.write(image, "JPEG", response.getOutputStream());
? ? //输出验证图片?
? ? out.clear();
? ? out = pageContext.pushBody();
%>
weblogic下面的代码
<%@page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" pageEncoding="UTF-8" %>
<%!
? ? Color getRandColor(int cc,int bb)
? ? {
? ? ? ? Random random = new Random();
? ? ? ? if(cc>255) cc=255;
? ? ? ? if(bb>255) bb=255;
? ? ? ? int r=cc+random.nextInt(bb-cc);
? ? ? ? int g=cc+random.nextInt(bb-cc);
? ? ? ? int b=cc+random.nextInt(bb-cc);
? ? ? ? return new Color(r,g,b);
? ? } //获取随机颜色
%>
<%
? ? response.setHeader("Pragma","No-cache");
? ? response.setHeader("Cache-Control","no-cache");
? ? response.setDateHeader("Expires", 0);
?
? ? int width=80; //定义验证码图片的长度
? ? int height=30; //定义验证码图片的宽度
? ? BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
? ? 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 i_x = random.nextInt(width);
? ? ? ?int i_y = random.nextInt(height);
? ? ? ?int i_xl = random.nextInt(12);
? ? ? ?int i_yl = random.nextInt(12);
? ? ? ?g.drawLine(i_x,i_y,i_x+i_xl,i_y+i_yl);
? ? }
? ? //用线条画背景
?
? ? String s_Rand="";
? ? for (int i=0;i<4;i++)
? ? {
? ? ? ?String rand=String.valueOf(random.nextInt(10));
? ? ? ?s_Rand+=rand;
? ? ??
? ? ? ?g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
? ? ? ?g.drawString(rand,13*i+6,16);
? ? }
? ? //产生4位随机码?
?
? ? session.setAttribute("rand",s_Rand);
? ? //将验证码存入Session中
? ? g.dispose(); ?
? ? response.reset();
? ? ImageIO.write(image, "JPEG", response.getOutputStream());
? ? //输出验证图片?
? ? //out.clear();
? ? //out = pageContext.pushBody();
%>
(网上有的说下面的这种写法不行,不能分行导入JAR包,经测试发现完全正常可用。)
?<%@page import=" java.io.*"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import=" javax.imageio.*"%>
<%@page import=" com.sun.image.codec.jpeg.*"%>
<%@page import=" com.htsoft.core.util.CreateFile"%>
<%@page ?pageEncoding="UTF-8" %>
<%
String path=request.getParameter("path");
String file = CreateFile.getFilepath()+path;
InputStream imageIn=null;
?
try{
response.reset();
response.setContentType("image/jpeg;charset=UTF-8");
OutputStream output=response.getOutputStream();
?
//得到图片的文件流
? ? ? ? imageIn = new FileInputStream(new File(file));
? ? ? ? //得到输入的编码器,将文件流进行jpg格式编码
? ? ? ? JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(imageIn);
? ? ? ? //得到编码后的图片对象
? ? ? ? BufferedImage image = decoder.decodeAsBufferedImage();
? ? ? ? //得到输出的编码器
? ? ? ? JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
? ? ? ? encoder.encode(image);//对图片进行输出编码
? ? ? ? imageIn.close();//关闭文件流
? ? ? ? output.close();
?
//out.clear();
//out = pageContext.pushBody();
}catch(FileNotFoundException e){
System.out.println("!新的图片流输出方式 :"+file);
}finally{
if(imageIn!=null){
imageIn.close();
}
}
?
?%>
?