`

图片验证码生成

 
阅读更多

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

 

请求方法:

/**
 * 获取生成图片验证码
 * @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;
        }
    }
}

 

 

 

分享到:
评论

相关推荐

    图片验证码生成demo

    这个"图片验证码生成demo"是一个示例项目,用于演示如何创建这样的验证码系统。在本文中,我们将深入探讨验证码的工作原理,以及如何使用编程技术来实现一个图片验证码生成器。 验证码的主要目标是防止自动化程序...

    图片验证码生成控件

    标题中的"图片验证码生成控件"指的是一个专门用于创建图像形式的验证码的软件组件。这种控件通常会生成一组随机字符,用户在提交表单前需要正确输入这些字符,以此验证他们是真实的人而不是程序。 描述中提到"支持...

    Java servlet 自动生成 图片验证码 生成 Java源码

    Java servlet 自动生成 图片验证码 生成 Java源码

    基于PHP的图片验证码生成设计源码

    本源码项目是基于PHP的图片验证码生成设计,包含50个文件,主要使用PHP和HTML编程语言。该项目实现了图片验证码的功能,用于表单提交验证,如注册登录等场景。系统提供了清晰的验证码图片,用户需要正确选择图片中的...

    图片验证码生成等

    在本压缩包中,提供的代码资源是关于图片验证码生成的,这对于网站安全和防止恶意爬虫是非常重要的。 图片验证码的主要目标是增加系统安全性,防止自动登录、恶意注册、垃圾评论等问题。它们通常由一串随机字符组成...

    VC++验证码生成Base64验证码png图片程序

    VC++验证码生成Base64验证码png图片程序,如何使用VC++生成验证码图片,输出Base64图片给网页调用

    java图片验证码生成

    java图片验证码生成。有干扰线。随机字符。

    python3中图片验证码生成程序

    在Python 3中,生成图片验证码是一项常见的任务,主要用于网站的身份验证,防止自动化脚本的恶意操作。这个程序提供了一种便捷的方式,在Python环境中创建自定义的验证码。下面将详细介绍这个验证码生成程序的关键...

    支持自定义背景的图片验证码生成类库

    扩展了kaptcha图片验证码生成库, 通过配置可以简单的实现自定义背景图片, 压缩包里有readme.md

    Java生成图片验证码工具类源码

    源码提供了一个生成图片验证码的工具类,适用于各种需要验证码的场景,如用户注册、登录等。该工具类使用随机字符生成验证码,并支持自定义验证码长度和字体样式。生成的验证码图片背景透明,线条清晰,可轻松辨认。...

    图片验证码生成及应用详解

    本篇文章将深入探讨图片验证码的生成原理、相关图像文件格式以及其在实际应用中的细节。 首先,我们来了解图片验证码的基本概念。它的主要目的是通过增加一道人工识别的门槛,防止恶意自动登录、批量注册等行为。...

    python2中图片验证码生成程序

    在Python 2环境中,你可以使用各种方法来创建自定义的验证码生成程序。这里我们将深入探讨如何利用Python的Pillow库来实现这一功能。 首先,`Pillow`库是Python的一个图像处理库,它是 PIL(Python Imaging Library...

    java_图片验证码生成

    java_图片验证码生成 &lt;servlet-name&gt;ImageServlet &lt;servlet-class&gt;com.mobile.control.ImageServlet&lt;/servlet-class&gt; &lt;servlet-name&gt;ImageServlet &lt;url-pattern&gt;/servlet/ImageServlet ...

    图片验证码生成工具类

    这个是生成图片验证码的工具,可以直接使用的,使用教程在https://blog.csdn.net/qq_31844349/article/details/97185842,这个只适合学习使用,不能用在商业软件中,可能会存在BUG,所以不能使用在系统软件开发中,如果您...

    vb 图片验证码生成识别 源代码

    vb 自身验证码生成图片并识别 源代码

    《java 图片验证码生成utils工具类》

    java 生成随机图片验证码 ,字母数组随机组合,加干扰线

    图片验证码生成实例带有横杠干扰

    JQuery调用后台的java类产生图片验证码。 很实用,下载后可以直接运行的实例! 有什么好的建议可以Q我623791070 谢谢

    Java图片验证码生成工具类

    好看的图片验证码,包含干扰线、噪点、扭曲图片等。。

    java 生成图片验证码

    在IT领域,验证码(CAPTCHA)是一...在提供的压缩包文件“图片验证码生成”中,可能包含了实现上述功能的源代码示例,你可以通过学习和理解这些代码,加深对Java生成图片验证码的理解,并根据实际需求进行调整和优化。

Global site tag (gtag.js) - Google Analytics