簡單的實現驗證碼

 <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"  οnclick="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);
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章