当前位置: 代码迷 >> Web前端 >> 验证码在TOMCAT跟WEBLOGIC下面的区别
  详细解决方案

验证码在TOMCAT跟WEBLOGIC下面的区别

热度:363   发布时间:2013-09-26 10:32:35.0
验证码在TOMCAT和WEBLOGIC下面的区别

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

}

}

?

?%>

?