生成验证码的代码

页面的点击事件:


package action;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

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

import sun.font.FontDesignMetrics;

/**
* 验证码
* 
* @author Administrator
* 
*/
public class ValidateCode {

     // 验证码图片的宽度
     private int width = 70;
     // 验证码图片的高度
     private int height = 20;
     // 验证码字符个数
     private int codeCount = 5;

     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' };

     /**
     * 页面上使用post提交时
     */
     public void validateCode(HttpServletRequest request,
               HttpServletResponse response) throws ServletException, IOException {
          // 定义图像buffer
          BufferedImage buffImg = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);
          Graphics2D g = buffImg.createGraphics();

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

          // 将图像填充为白色
          g.setColor(Color.WHITE);
          g.fillRect(0, 0, width, height);

          // 创建字体,字体的大小应该根据图片的高度来定。
          Font font = new Font("Fixedsys", Font.BOLD, 15);
          // 设置字体。
          g.setFont(font);
          // ★★★★获取字体的高度和宽度★★★★★
          FontMetrics fm = FontDesignMetrics.getMetrics(font);
          // 高度
          // System.out.println(fm.getHeight());
          // 单个字符宽度
          // System.out.println(fm.charWidth('A'));
          // 整个字符串的宽度
          // System.out.println(fm.stringWidth("ABC"));

          // 画边框。
          g.setColor(Color.BLACK);
          g.drawRect(0, 0, width - 1, height - 1);

          // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
          g.setColor(Color.BLACK);
          for (int i = 0; i < 80; i++) {
               int x = random.nextInt(width);
               int y = random.nextInt(height);
               int xl = random.nextInt(1);
               int yl = random.nextInt(1);
               g.drawLine(x, y, x + xl, y + yl);
          }

          // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
          StringBuffer randomCode = new StringBuffer();
          int red = 0, green = 0, blue = 0;

          // 随机产生codeCount数字的验证码。
          int ww = 5;
          for (int i = 0; i < codeCount; i++) {
               // 得到随机产生的验证码数字。
               String strRand = String.valueOf(codeSequence[random.nextInt(36)]);
               // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
               red = random.nextInt(255);
               green = random.nextInt(100);
               blue = random.nextInt(255);

               // 用随机产生的颜色将验证码绘制到图像中。
               g.setColor(new Color(red, green, blue));
               g.drawString(strRand, ww, 15);
               int fontW = fm.charWidth('W');// strRand.charAt(0)
               ww += fontW;
               // 将产生的四个随机数组合在一起。
               randomCode.append(strRand);
          }
          // 将四位数字的验证码保存到Session中。
          HttpSession session = request.getSession();
          session.setAttribute("ValidateCode", randomCode.toString());

          // 禁止图像缓存。
          response.setHeader("Pragma", "no-cache");
          response.setHeader("Cache-Control", "no-cache");
          response.setDateHeader("Expires", 0);
          response.setContentType("image/jpeg");

          // 图片生效
          g.dispose();
          // 将图像输出到Servlet输出流中。
          ImageIO.write(buffImg, "jpeg", response.getOutputStream());
     }



}


这个代码是参考别人的,以后有需要的话就可以直接查看这个资料。


原文地址:https://www.cnblogs.com/murong/p/4969496.html