当前位置: 代码迷 >> Java Web开发 >> 验证码在IE上报错ImageIO.write
  详细解决方案

验证码在IE上报错ImageIO.write

热度:6172   发布时间:2013-02-25 21:05:17.0
验证码在IE下报错ImageIO.write
求助大神,在谷歌浏览器运行是正常的,但是在IE就会报错。
生成验证码代码如下:
public String yanzheng(){
        int height = 28;
int width = 80;
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = buffImg.createGraphics();
Random random = new Random();
g.setBackground(getRandColor(200, 250));
g.fillRect(0, 0, width, height);
Font font = new Font("Times New Roman", Font.HANGING_BASELINE, 28);
g.setFont(font);
g.setColor(Color.BLACK);
g.drawRect(0, 0, width-1, height-1);
g.setColor(getRandColor(160, 200));
for(int i = 0; i < 155; i++){
int x = random.nextInt(width);
int y = random.nextInt(height);
int x1 = random.nextInt(12);
int y1 = random.nextInt(12);
g.drawLine(x, y, x1, y1);
}

StringBuffer  randomCode = new StringBuffer();
int length = 4;
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
int size = base.length();
for(int i = 0; i < length; i++){
int start = random.nextInt(size);
String str = base.substring(start, start + 1);
g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
g.drawString(str, 15 * i + 6, 24);
randomCode.append(str);
}

HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();

request.getSession().setAttribute("rand", randomCode.toString());
g.dispose();

response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0); 
  
response.setContentType("image/jpeg"); 
        
ServletOutputStream sos;
try{
     sos = response.getOutputStream();
     ImageIO.write(buffImg, "gif", sos);
     sos.flush();
     sos.close();
}catch(Exception e){
     e.printStackTrace();
}

return null;
}


private 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);
}

在谷歌浏览器下运行很正常。但是在IE下就报错了。报错如下:
ClientAbortException:  java.net.SocketException: Connection reset by peer: socket write error
at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:319)
at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:288)
at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:98)
at javax.imageio.stream.FileCacheImageOutputStream.close(FileCacheImageOutputStream.java:213)
  相关解决方案