验证码生成工具类

来源:互联网 发布:交易软件备案 编辑:程序博客网 时间:2024/05/29 08:08

转自:http://blog.csdn.net/s20081294/article/details/44458515?ref=myread

在html中:

<img  src="/dev/code_makeImg.action" alt="" width="130px" height="53px"/>

后台程序:

import java.awt.Color;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.Random;


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


import com.wangding.action.BaseAction;




public class ImgMakeAction extends BaseAction
{


    private static int WIDTH = 90;// 设置图片的宽度


    private static int HEIGHT = 22;// 设置图片的高度


    /** 图片验证码
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return
     * @throws Exception */


    public void makeImg() throws Exception
    {
        // 设置返回类型为 :IMAGE/JPEG的形式图片
    HttpServletRequest request = this.getRequest();
    HttpServletResponse response = this.getResponse();
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        HttpSession session = request.getSession();
        response.setContentType("image/jpeg");


        // 使用SERVLET的输出流来接收返回的输入流信息
        ServletOutputStream sos = response.getOutputStream();


        // 通过有参数的构造方法来初始化图片类
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();


        // 使用字符数组来接受动态生成字符
        char[] rands = generateCheckCode();
        drawBackground(g);
        drawRands(g, rands);
        g.dispose();


        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ImageIO.write(image, "JPEG", bos);
        byte[] buf = bos.toByteArray();
        response.setContentLength(buf.length);


        // 将生成的图片信息进行打印输出
        sos.write(buf);


        // 关闭输出流
        bos.close();


        // 关闭输出流
        sos.close();


        // 将动态生成的字符进行SESSION范围内的存储
        session.setAttribute("token", new String(rands));
    }


    /** 随机生成图片背景
     * 
     * @param g */
    private void drawBackground(Graphics g)
    {
        g.setColor(new Color(0xDCDCDC));
        g.fillRect(0, 0, WIDTH, HEIGHT);
        for (int i = 0; i < 120; i++)
        {
            int x = (int) (Math.random() * WIDTH);
            int y = (int) (Math.random() * HEIGHT);
            int red = (int) (Math.random() * 255);
            int green = (int) (Math.random() * 255);
            int blue = (int) (Math.random() * 255);
            g.setColor(new Color(red, green, blue));
            g.drawOval(x, y, 1, 0);
        }
    }


    /** 设置动态图片属性
     * 
     * @param g
     * @param rands */
    private void drawRands(Graphics g, char[] rands)
    {


        Random random = new Random();
        int red = random.nextInt(110);
        int green = random.nextInt(50);
        int blue = random.nextInt(50);
        g.setColor(new Color(red, green, blue));
        g.setFont(new Font(null, Font.BOLD, 18));
        g.drawString("" + rands[0], 1, 17);
        g.drawString("" + rands[1], 16, 17);
        g.drawString("" + rands[2], 31, 17);
        g.drawString("" + rands[3], 46, 17);
        g.drawString("" + rands[4], 61, 17);
        g.drawString("" + rands[5], 76, 17);


    }


    /** 动态生成字符数组
     * 
     * @return rands */
    private char[] generateCheckCode()
    {
        String chars = "0123456789abcdefghijklmnopqrstuvwxyz";
        char[] rands = new char[6];
        for (int i = 0; i < 6; i++)
        {
            int rand = (int) (Math.random() * 36);
            rands[i] = chars.charAt(rand);
        }
        return rands;
    }


}
0 0
原创粉丝点击