根据网上搜索的一份资料来编写一个动态验证码,
地址是:http://wenku.baidu.com/view/b7b2f901e87101f69e3195f8.html
  但是在里面第一个1、用来生成验证码图片的Servlet有一个Constants类在myeclipse无法解释报错,但我资料里也找不到有这个类包。Constants.VALIDATE_CODE_KEY着一段好像处理不了,如果导入一些类给Constant,则这一段就报错,如果不导入,则Constant报错。
  另外,在另一个“用来处理用户提交的Servlet”中,多次调用到Constant,也是因为要调用这个类但是找不到而报错。
// 将四位数字的验证码保存到Session中。
        HttpSession session = req.getSession();
        session.setAttribute(Constants.VALIDATE_CODE_KEY, randomCode.toString());        // 禁止图像缓存。
        resp.setHeader("Pragma", "no-cache");
        resp.setHeader("Cache-Control", "no-cache");
        resp.setDateHeader("Expires", 0);        resp.setContentType("image/jpeg");        // 将图像输出到Servlet输出流中。

解决方案 »

  1.   

    2年前做的项目的验证码。。瞅瞅看看对你有没有帮助。呵呵
    package org.myledu.meth;import javax.servlet.*;
    import javax.servlet.http.*;
    import java.io.*;
    import java.awt.*;
    import java.awt.image.*;
    import java.util.*;
    import javax.imageio.*;/**
     * 图形验证码 xiaobuding 2010-5-7
     */
    public class AuthImg extends HttpServlet {private static final long serialVersionUID = 1L;
    // 定义图形验证码中绘制字符的字体
    private final Font mFont = new Font("Arial Black", Font.PLAIN, 16);
    // 定义图形验证码的大小
    private final int IMG_WIDTH = 100;
    private final int IMG_HEIGTH = 20;// 定义一个获取随机颜色的方法
    private 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);
    }// 重写service方法,生成对客户端的响应
    public void service(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    // 设置禁止缓存
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);
    response.setContentType("image/jpeg");
    BufferedImage image = new BufferedImage(IMG_WIDTH, IMG_HEIGTH,
    BufferedImage.TYPE_INT_RGB);
    Graphics g = image.getGraphics();
    Random random = new Random();
    g.setColor(getRandColor(200, 250));
    // 填充背景色
    g.fillRect(1, 1, IMG_WIDTH - 1, IMG_HEIGTH - 1);
    // 为图形验证码绘制边框
    g.setColor(new Color(102, 102, 102));
    g.drawRect(0, 0, IMG_WIDTH - 1, IMG_HEIGTH - 1);
    g.setColor(getRandColor(160, 200));
    // 生成随机干扰线
    for (int i = 0; i < 80; i++) {
    int x = random.nextInt(IMG_WIDTH - 1);
    int y = random.nextInt(IMG_HEIGTH - 1);
    int xl = random.nextInt(6) + 1;
    int yl = random.nextInt(12) + 1;
    g.drawLine(x, y, x + xl, y + yl);
    }
    g.setColor(getRandColor(160, 200));
    // 生成随机干扰线
    for (int i = 0; i < 80; i++) {
    int x = random.nextInt(IMG_WIDTH - 1);
    int y = random.nextInt(IMG_HEIGTH - 1);
    int xl = random.nextInt(12) + 1;
    int yl = random.nextInt(6) + 1;
    g.drawLine(x, y, x - xl, y - yl);
    }
    // 设置绘制字符的字体
    g.setFont(mFont);
    // 用于保存系统生成的随机字符串
    String sRand = "";
    for (int i = 0; i < 6; i++) {
    String tmp = getRandomChar();
    sRand += tmp;
    // 获取随机颜色
    g.setColor(new Color(20 + random.nextInt(110), 20 + random
    .nextInt(110), 20 + random.nextInt(110)));
    // 在图片上绘制系统生成的随机字符
    g.drawString(tmp, 15 * i + 10, 15);
    }
    // 获取HttpSesssion对象
    HttpSession session = request.getSession(true);
    // 将随机字符串放入HttpSesssion对象中
    session.setAttribute("rand", sRand);
    g.dispose();
    // 向输出流中输出图片
    ImageIO.write(image, "JPEG", response.getOutputStream());
    }// 定义获取随机字符串方法
    private String getRandomChar() {
    // 生成一个0、1、2的随机数字
    int rand = (int) Math.round(Math.random() * 2);
    long itmp = 0;
    char ctmp = '\u0000';
    switch (rand) {
    // 生成大写字母
    case 1:
    itmp = Math.round(Math.random() * 25 + 65);
    ctmp = (char) itmp;
    return String.valueOf(ctmp);
    // 生成小写字母
    case 2:
    itmp = Math.round(Math.random() * 25 + 97);
    ctmp = (char) itmp;
    return String.valueOf(ctmp);
    // 生成数字
    default:
    itmp = Math.round(Math.random() * 9);
    return itmp + "";
    }
    }
    }
    action中
    private String code;//验证码
    String rand = (String)ActionContext.getContext().getSession().get("rand");//获得验证码
    rand=rand.toUpperCase();//转换字符串
    code=code.toUpperCase();//转换字符串
    if(!rand.trim().equals(code)){
    ActionContext.getContext().put("message", "<font color='red'>您输入的验证码有误!验证码不区分大小写!请重新输入</font>");
    loginResult = "failed";
    }
    web.xml中
    <servlet>
    <servlet-name>AuthImg</servlet-name>
    <servlet-class>org.myledu.meth.AuthImg</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>AuthImg</servlet-name>
    <url-pattern>/authImg.jpg</url-pattern>
    </servlet-mapping>
     页面中
      //验证码function changeImg(){
    document.getElementById("authImg").src = "authImg.jpg?timpstamp=" + new Date().getTime();
    }
     <tr>
    <td height="50" style="font-size:14px; color:#333333; font-weight:bold;text-align:left; padding-left:30px;">
    验证码:
    <input name="code" id="code" maxlength="6" onmousemove="return lyan();" onkeydown="return isNull();" type="text" style="width:50px; font-size:16px; border:solid 1px #cccccc; height:20px;"/>
    <img src="authImg.jpg" id="authImg" align="absmiddle"/>
    <input type="button" value="看不清,换一张" onclick="changeImg();" />
    ${message }
    <br />
    </td>
    </tr>