图片验证码生成

在发送短信的时候,一般需要增加图片验证码功能,用以防刷。这里介绍下验证码生成:

请求方法:

/**
 * 获取生成图片验证码
 * @param request
 * @param response
 * @return
 * @throws Exception
 */
@RequestMapping("/getImageCode")
public void getImageCode(HttpServletRequest request, HttpServletResponse response) throws Exception {
	// 获取生成验证码图片
	ValidatorCode imageCode = ValidatorCodeUtil.getCode();
	
	logger.info("------ 生成的图片验证码为: " + imageCode.getCode());
	
	// 放入session中
	request.getSession().setAttribute("imageCode", imageCode.getCode());
	
	// 禁止图像缓存
	response.setHeader("Pragma", "no-cache");
	response.setHeader("Cache-Control", "no-cache");
	response.setDateHeader("Expires", 0);
	response.setContentType("image/jpeg");
	
	// 输出流
	ServletOutputStream out = null;
	
	try {
		// 将图片输出到Servlet输出流
		out = response.getOutputStream();
		
		ImageIO.write(imageCode.getImage(), "jpg", out);
		
		out.flush();
		out.close();
		
	} catch (Exception e) {
		// 异常信息
		String errMsg = printException(e);
		
		logger.error("------ 生成图片验证码异常: " + errMsg);
		
	} finally {
		if (out != null) {
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
}

工具类:

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

/**
 * 图片验证码生成工具类
 *
 */
public class ValidatorCodeUtil {
	
	/**
	 * 生成验证码图片
	 * @return
	 */
    public static ValidatorCode getCode() {
        // 图片宽度
        int width = 80;
        // 图片高度
        int height = 30;
        
        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("微软雅黑", Font.HANGING_BASELINE, 28);
        g.setFont(font);
                                                 
        // 画边框
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, width - 1, height - 1);
        
        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到。
         g.setColor(Color.GRAY);
         g.setColor(getRandColor(160, 200));
	         for (int i = 0; i < 155; i++) {
	         int x = random.nextInt(width);
	         int y = random.nextInt(height);
	         int xl = random.nextInt(12);
	         int yl = random.nextInt(12);
	         g.drawLine(x, y, x + xl, y + yl);
         }
                                                 
        // 用于保存随机产生的验证码
        StringBuffer randomCode = new StringBuffer();
                                                 
        // 验证码位数
        int length = 4;
        // 设置备选验证码:包括"a-z"和数字"0-9"
        String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                                                 
        int size = base.length();
                                                 
        // 随机产生4位验证码
        for (int i = 0; i < length; i++) {
            // 得到随机产生的验证码数字
            int start = random.nextInt(size);
            String strRand = base.substring(start, start + 1);
                                                           
            // 用随机产生的颜色将验证码绘制到图像中
            // g.setColor(getRandColor(1, 100));
                                                             
            // 调用函数出来的颜色相同
            g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
            g.drawString(strRand, 15 * i + 6, 24);
                                                 
            // 将产生的四个随机数组合在一起
            randomCode.append(strRand);
        }
                                                 
        // 图象生效
        g.dispose();
        
        ValidatorCode code = new ValidatorCode();
        code.image = buffImg;
        code.code = randomCode.toString();
        
        return code;
    }
                                                 
    /**
     * 指定范围获得随机颜色
     * @param fc
     * @param bc
     * @return
     */
    private static 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);
    }
                                                 
    /**
     * 验证码图片封装
     * @author zhangdonglei
     *
     */
    public static class ValidatorCode {
        private BufferedImage image;
        private String code;
                                                 
        public BufferedImage getImage() {
            return image;
        }
                                                 
        public String getCode() {
            return code;
        }
    }
}

猜你喜欢

转载自z724130632.iteye.com/blog/2382740