Java 验证码 不显示图片

jiangeb jiangeb 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
大家好,我用了一个网上的产生登录验证码的类。已经部署好了,但是运行的时候图片没有产生,是一个红叉。我把这个类贴出来,大家帮看看,浪费大家时间了,谢谢!

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.awt.*;

import java.awt.image.*;

import javax.imageio.ImageIO;



public class CheckCodeServlet extends HttpServlet

{

private static int WIDTH = 60;

private static int HEIGHT = 20;

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException

{

HttpSession session = request.getSession();

response.setContentType("image/jpeg");

ServletOutputStream sos = response.getOutputStream();



// 设置浏览器不要缓存此图片

response.setHeader("Pragma","No-cache");

response.setHeader("Cache-Control","no-cache");

response.setDateHeader("Expires", 0);



// 创建内存图象并获得其图形上下文

BufferedImage image =

new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

Graphics g = image.getGraphics();



// 产生随机的认证码

char [] rands = generateCheckCode();



// 产生图像

drawBackground(g);

drawRands(g,rands);



// 结束图像 的绘制 过程, 完成图像

g.dispose();




// 将图像输出到客户端

ByteArrayOutputStream bos = new ByteArrayOutputStream();

ImageIO.write(image, "JPEG", bos);

byte [] buf = bos.toByteArray();

response.setContentLength(buf.length);

// 下面的语句也可写成: bos.writeTo(sos);

sos.write(buf);

bos.close();

sos.close();



// 将当前验证码存入到 Session 中

session.setAttribute("check_code",new String(rands));

// 直接使用下面的代码将有问题, Session 对象必须在提交响应前获得

//request.getSession().setAttribute("check_code",new String(rands));

}



private char [] generateCheckCode()

{

// 定义验证码的字符表

String chars = "0123456789abcdefghijklmnopqrstuvwxyz";

char [] rands = new char[4];

for(int i=0; i<4; i++)

{

int rand = (int)(Math.random() * 36);

rands[i] = chars.charAt(rand);

}

return rands;

}



private void drawRands(Graphics g , char [] rands)

{

g.setColor(Color.BLACK);

g.setFont(new Font(null,Font.ITALIC|Font.BOLD,18));

// 在不同的高度上输出验证码的每个字符

g.drawString("" + rands[0],1,17);

g.drawString("" + rands[1],16,15);

g.drawString("" + rands[2],31,18);

g.drawString("" + rands[3],46,16);

System.out.println(rands);

}



private void drawBackground(Graphics g)

{

// 画背景

g.setColor(new Color(0xDCDCDC));

g.fillRect(0, 0, WIDTH, HEIGHT);

// 随机产生 120 个干扰点

for(int i=0; i<120; i++)

{

int x = (int)(Math.random() * WIDTH);

int y = (int)(Math.random() * HEIGHT);

int red = (int)(Math.random() * 255);

int green = (int)(Math.random() * 255);

int blue = (int)(Math.random() * 255);

g.setColor(new Color(red,green,blue));

g.drawOval(x,y,1,0);

}

}

}
...全文

相关推荐

评论 5
收藏 已收藏
分享
返回顶部
jiangeb
Web 开发 81,108 成员 341,721 内容