`

验证码在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();

}

}

 

 %>

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics