用java代码 生成验证码的一个示例类

来源:互联网 发布:比知乎更好的网站 编辑:程序博客网 时间:2024/04/28 14:23

在jsp里这样调用

 <table width="100%" border="0" cellpadding="0" cellspacing="0" style="margin:0 auto;">
          <tr>
          <td width="20"><html:text property="validateCode" size="8" /></td>

         <td>&nbsp;</td><td align="left" valign="top"><div id="validateCodeImage" valign="top"></div>

        <script type="text/javascript">updateValidateCode(70, 25)</script><

        /td>
        </tr>
 </table>

js里脚本

function updateValidateCode(width, height) {
  document.getElementById('validateCodeImage').innerHTML = '<img id="validateCodeImg"  onclick="updateValidateCode(' + width + ', '+ height + ')" width="' + width + '" height="' + height + '" src="<%= contextPath %>/validatecode.do" style="cursor:hand" alt="如果看不清验证码,请点图片刷新" />';
}

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

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

import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * MyEclipse Struts Creation date: 05-31-2007
 *
 * XDoclet definition:
 *
 * @struts.action validate="true"
 */
public class ValidateCodeAction extends Action {
    /*
     * Generated Methods
     */

    /**
     * Method execute
     *
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     */
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) {
        // 设置图片的长宽
        int width = StringUtils.isNotBlank(request.getParameter("width")) ? Integer
                .parseInt(request.getParameter("width"))
                : 0;
        int height = StringUtils.isNotBlank(request.getParameter("height")) ? Integer
                .parseInt(request.getParameter("height"))
                : 0;
        if (width < 70 || width > 140) {
            width = 70;
        }
        if (height < 25 || height > 50) {
            height = 25;
        }

        // 创建内存图像
        BufferedImage image = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        // 获取图形上下文
        Graphics g = image.createGraphics();

        // 设定图像背景色(因为是做背景,所以偏淡)
        g.setColor(getRandColor(180, 250));
        g.fillRect(0, 0, width, height);
        // 设置字体
        g.setFont(new Font("Arial", Font.BOLD, 19));

        // 设置默认生成4个验证码
        int length = 4;
        // 设置随机种子
        java.util.Random rand = new Random();

        // 设置备选验证码:包括"a-z"和数字"0-9",其中去掉了一些容易混淆的字符
        String base = "abcdefghijkmnqrstuvwxyz23456789";
        int size = base.length();
        StringBuffer str = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int start = rand.nextInt(size);
            String tmpStr = base.substring(start, start + 1);

            str.append(tmpStr);
            // 生成随机颜色(因为是做前景,所以偏深)
            g.setColor(getRandColor(10, 150));

            // 将此字画到图片上
            // g.drawString(str.toString(), 4, 17);
            g.drawString(tmpStr, 13 * i + 6 + rand.nextInt(5), 14 + rand
                    .nextInt(6));
            // 随机画点
            for (int j = 0; j < 20; j++) {
                int x = rand.nextInt(width);
                int y = rand.nextInt(height);
                g.drawOval(x, y, 0, 0);
            }
            /*
            // 随机画线
            for (int j = 0; j < 2; j++) {
                int x = rand.nextInt(width);
                int y = rand.nextInt(height);
                int x1 = rand.nextInt(12);
                int y1 = rand.nextInt(12);
                g.drawLine(x, y, x + x1, y + y1);
            }
            */
        }

        // 将认证码存入session
        request.getSession().setAttribute("validateCode", str.toString());

        // 图象生效
        g.dispose();

        // 设置页面不缓存
        response.setDateHeader("Expires", -1);
        response.setHeader("Cache-Control",
                "no-store, private, post-check=0, pre-check=0, max-age=0");
        response.setHeader("Pragma", "no-cache");

        // 输出图象到页面
        try {
            ImageIO.write(image, "JPEG", response.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    // 给定范围获得一个随机颜色
    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);
    }

原创粉丝点击