当前位置:文档之家› 图片验证码生成Servlet源代码

图片验证码生成Servlet源代码

图片验证码生成: 摆渡恋人 Web.xml文件配置: This is the description of my J2EE component This is the display name of my J2EE component ImageCheckServlet check.servlet.ImageCheckServlet width 800 height 400 codeCount 4

ImageCheckServlet /servlet/ImageCheckServlet

Package check.servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.util.Random;

import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession;

public class ImageCheckServlet extends HttpServlet { /** * */ private static final long serialVersionUID = -1475131268628773633L;

/** * 验证码图片的宽度。 */ private int width = 80;

/** * 验证码图片的高度。 */ private int height = 40;

/** * 验证码字符个数 */ private int codeCount = 4;

/** * 字体高度 */ private int fontHeight;

private int codeX = 0; private int codeY = 0;

char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; /** * 初始化验证图片属性 */ public void init() throws ServletException { /**

* 从web.xml中获取初始信息 */ /** * 宽度 */ String strWidth = this.getInitParameter("width"); /** * 高度 */ String strHeight = this.getInitParameter("height"); /** * 字符个数 */ String strCodeCount = this.getInitParameter("codeCount");

/** * 将配置的信息转换成数值 */ try { if (strWidth != null && strWidth.length() != 0) { width = Integer.parseInt(strWidth); } if (strHeight != null && strHeight.length() != 0) { height = Integer.parseInt(strHeight); } if (strCodeCount != null && strCodeCount.length() != 0) { codeCount = Integer.parseInt(strCodeCount);

/** * 在这里限制验证码字符的个数确定范围在4-10个之间 * */ if (codeCount > 8) { codeCount = 8; } if (codeCount < 4) { codeCount = 4; }

} } catch (NumberFormatException e) { e.printStackTrace(); } System.out.println("width:" + width); System.out.println("height:" + height);

/** * 字体大小应该是画布高减去上沿和下沿 * * 上下沿分别是5 */ fontHeight = (int) (height * 0.8F); /**

* 字体的X坐标 */ codeX = width / (codeCount + 1); /** * 字体的Y坐标 */ codeY = (int) (height * 0.8F); System.out.println("codeX:" + codeX); System.out.println("codeY:" + codeY);

} protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException {

/** * 定义图像buffer */ BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = buffImg.createGraphics(); /** * 将图像填充为白色 */ g.setColor(Color.WHITE); g.fillRect(0, 0, width, height);

/** * 创建字体,字体的大小应该根据图片的高度来定。 */ Font font = new Font("宋体", Font.ROMAN_BASELINE, fontHeight); /**

* 设置字体。 */ g.setFont(font);

/** * 画边框。 */ g.setColor(Color.BLACK);

/** * drawRect(x,y,width,height); *

* x,y矩形的位置 * * width,height矩形的大小 */ g.drawRect(5, 5, width - 10, height - 10);

/** * 创建一个随机数生成器类 */ Random random = new Random();

/** * 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。 */

for (int i = 0; i < 100; i++) { g.setColor(randomColor()); int x1 = random.nextInt(width); int y1 = random.nextInt(height); int x2 = random.nextInt(width); int y2 = random.nextInt(height); /**

* 在此图形上下文的坐标系中,使用当前颜色在点 (x1, y1) 和 (x2, y2) 之间画一条线 */ g.drawLine(x1, y1, x2, y2); } /**

* randomCode用于保存随机产生的验证码,以便进行验证。 */ StringBuffer randomCode = new StringBuffer();

// 随机产生codeCount数字的验证码。 for (int i = 0; i < codeCount; i++) { /**

* 得到随机产生的验证码数字。 */ String strRand = String.valueOf(codeSequence[random.nextInt(36)]); /**

* 设置验证码的随机颜色值 */ g.setColor(randomColor()); /**

* 将验证码画到画布上去 */ g.drawString(strRand, (i + 1) * codeX - (int) (buffImg.getWidth() * 0.65F / codeCount), codeY); /** * 将产生的四个随机数组合在一起,在验证的时候使用 */ randomCode.append(strRand); } /** * 将四位数字的验证码保存到Session中。 */ HttpSession session = req.getSession(); session.setAttribute("validateCode",

相关主题