|
登录验证码代码,一个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();
}
}
%>
|
|