生成图形验证码

来源:互联网 发布:淘宝lol账号交易平台 编辑:程序博客网 时间:2024/05/01 15:41

做了好几次图形验证的需求了,今天好好总结一下,将自己的代码备份一下,便于自己以后方面开发

在做项目的注册用户的时候,一般我们都会用验证码进行验证,那么我们的验证码怎么来了,有3个方法:

1、单纯的用数字进操作,

2、用已有图片进行绑定的方式;

3、在后台自动生成。

这里将的方式就是第三种。

ImageCode.java

package com.jzt.b2b.util;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.geom.AffineTransform;import java.awt.image.BufferedImage;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;/** * @author hushengyou 生成图形验证码 */public class ImageCode {    // 图片的宽度    private final static int    IMAGEWIDTH  = 120;    // 图片的高度    private final static int    IMAGEHEIGHT = 30;    // 字体大小    private final static int    FONTSIZE    = 14;    // 字符串长度    private final static int    CODE_LENGTH = 6;    // 随机字符范围    private final static char[] CHAR_RANGE  = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();    private static Random       random      = new Random();    /**     * 获得图片缓冲流     */    public String getImageCode(HttpServletResponse response) {        // 设置不缓存图片        response.setHeader("Pragma", "no-cache");        response.setHeader("Cache-Control", "no-cache");        response.setDateHeader("Expires", 0);        // 指定生成的相应图片        response.setContentType("image/jpeg");        // 生成画布 //IMAGEWIDTH * CODE_LENGTH        BufferedImage image = new BufferedImage(IMAGEWIDTH, IMAGEHEIGHT, BufferedImage.TYPE_INT_RGB);        // 获取图形上下文 (生成画笔)        Graphics2D graphics = image.createGraphics();        // 设置背景色()        graphics.setColor(getRandomColor(200, 255));        // 设置字体        graphics.setFont(new Font("Times New Roman", Font.BOLD, FONTSIZE));        // 填充矩形区域 ,绘制背景        graphics.fillRect(0, 0, IMAGEWIDTH, IMAGEHEIGHT);        graphics.setColor(getRandomColor(180, 200));        // 绘制随机干扰线        drawRandomLines(graphics, 160);        // 获取随机字符        String code = getRandomString();        // 绘制随机字符        drawRandomString(graphics, code);        // 图像生效        graphics.dispose();        try {            ServletOutputStream sos = response.getOutputStream();            ImageIO.write(image, "jpeg", sos);            sos.flush();            sos.close();        } catch (Exception e) {            e.printStackTrace();        }        return code;    }    /**     * 生成指定字符串的图像     *      * @param verifyCode 即将被打印的随机字符串     * @return 生成的图像     */    private static void drawRandomString(Graphics2D graphics, String code) {        Color color = new Color(20 + random.nextInt(20), 20 + random.nextInt(20), 20 + random.nextInt(20));        // 设置边框颜色        graphics.setColor(color);        // // 画出边框        // for (int i = 0; i < 2; i++)        // graphics.drawRect(i, i, IMAGEWIDTH * CODE_LENGTH - i * 2 - 1, IMAGEHEIGHT - i * 2 - 1);        // 画字符串        for (int i = 0; i < CODE_LENGTH; i++) {            String temp = code.substring(i, i + 1);            // 想文字旋转一定的角度            AffineTransform trans = new AffineTransform();            trans.rotate(random.nextInt(45) * 3.14 / 180, 15 * i + 8, 7);            // 缩放文字            float scaleSize = random.nextFloat() + 0.8f;            if (scaleSize > 1f) scaleSize = 1f;            trans.scale(scaleSize, scaleSize);            graphics.setTransform(trans);            graphics.setColor(getRandomColor(0, 180));            // 设置字体位于的位置(字,x轴,y轴)            graphics.drawString(temp, 15 * i + 18, 14);        }    }    /**     * 生成随机字符串     *      * @return 随机字符串     */    public static String getRandomString() {        StringBuilder sb = new StringBuilder();        for (int i = 0; i < CODE_LENGTH; i++) {            sb.append(CHAR_RANGE[random.nextInt(CHAR_RANGE.length)]);        }        return sb.toString();    }    /**     * 生成随机颜色     *      * @param ll 产生颜色值下限(lower limit)     * @param ul 产生颜色值上限(upper limit)     * @return 生成的随机颜色对象RGB     */    private static Color getRandomColor(int ll, int ul) {        if (ll > 255) ll = 200;        if (ul > 255) ul = 255;        int r = random.nextInt(ul - ll);        int g = random.nextInt(ul - ll);        int b = random.nextInt(ul - ll);        Color color = new Color(r, g, b);        return color;    }    /**     * 绘制干扰线     *      * @param graphics Graphics2D对象,用来绘制图像     * @param nums 干扰线的条数     * @return     */    public static void drawRandomLines(Graphics2D graphics, int nums) {        // 设置随机干扰线条颜色        graphics.setColor(getRandomColor(160, 200));        // //产生nums 条干扰线条        for (int i = 0; i < nums; i++) {            int x1 = random.nextInt(IMAGEWIDTH);            int y1 = random.nextInt(IMAGEHEIGHT);            int x2 = random.nextInt(12);            int y2 = random.nextInt(12);            graphics.drawLine(x1, y1, x2, y2);        }    }}

jsp代码:
<img src="/user/imageCode.htm" class="codePic" id="codePic"/><a href="javascript:refresh()">换一组</a>function refresh(){    $("#codePic").attr("src","/user/imageCode.htm?t="+new Date());}


注意:如果用Spring MVC框架开的话,可以利用

spring MVC中引入captcha的插件生成图片验证码

具体查看,Spring mvc 自动生成图片验证码

0 0
原创粉丝点击