验证码生成类(RandomValidateCode .java):

import java.awt.Color;

import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


public class RandomValidateCode {

    public static String validateCode = null;  
    public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的key  
    private Random random = new Random();  
    private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机产生的字符串  
   
    private int width = 80;// 图片宽  
    private int height = 26;// 图片高  
    private int lineSize = 40;// 干扰线数量  
    private int stringNum = 4;// 随机产生字符数量  
   
    /* 
     * 获得字体 
     */  
    private Font getFont() {  
        return new Font("Fixedsys", Font.CENTER_BASELINE, 18);  
    }  
   
    /* 
     * 获得颜色 
     */  
    private Color getRandColor(int fc, int bc) {  
        if (fc > 255)  
            fc = 255;  
        if (bc > 255)  
            bc = 255;  
        int r = fc + random.nextInt(bc - fc - 16);  
        int g = fc + random.nextInt(bc - fc - 14);  
        int b = fc + random.nextInt(bc - fc - 18);  
        return new Color(r, g, b);  
    }  
   
    /** 
     * 生成随机图片 
     */  
    public void getRandcode(HttpServletRequest request,  
        HttpServletResponse response) {  
        HttpSession session = request.getSession();  
        // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类  
        BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);  
        Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作  
        g.fillRect(0, 0, width, height);  
        g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));  
        g.setColor(getRandColor(110, 133));  
        // 绘制干扰线  
        for (int i = 0; i <= lineSize; i++) {  
            drowLine(g);  
        }  
        // 绘制随机字符  
        String randomString = "";  
        for (int i = 1; i <= stringNum; i++) {  
            randomString = drowString(g, randomString, i);  
        }  
        session.removeAttribute(RANDOMCODEKEY);  
        session.setAttribute(RANDOMCODEKEY, randomString);  
        validateCode = randomString.toUpperCase();  
        g.dispose();  
        try {  
            ImageIO.write(image, "JPEG", response.getOutputStream());// 将内存中的图片通过流动形式输出到客户端  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
   
    /* 
     * 绘制字符串 
     */  
    private String drowString(Graphics g, String randomString, int i) {  
        g.setFont(getFont());  
        g.setColor(new Color(random.nextInt(101), random.nextInt(111), random.nextInt(121)));  
        String rand = String.valueOf(getRandomString(random.nextInt(randString.length())));  
        randomString += rand;  
        g.translate(random.nextInt(3), random.nextInt(3));  
        g.drawString(rand, 13 * i, 16);  
        return randomString;  
    }  
   
    /* 
     * 绘制干扰线 
     */  
    private void drowLine(Graphics g) {  
        int x = random.nextInt(width);  
        int y = random.nextInt(height);  
        int xl = random.nextInt(13);  
        int yl = random.nextInt(15);  
        g.drawLine(x, y, x + xl, y + yl);  
    }  
   
    /* 
     * 获取随机的字符 
     */ 
    public String getRandomString(int num) {  
        return String.valueOf(randString.charAt(num));  
    }  

}

-----------------------------------------------------------默默无闻的分割线-----------------------------------------------------------

验证码生成Servlet(ImageServlet.java):

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ImageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public ImageServlet() {

       super();
    }


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }  

    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {  
    response.setContentType("image/jpeg");// 设置相应类型,告诉浏览器输出的内容为图片  
        response.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容  
        response.setHeader("Cache-Control", "no-cache");  
        response.setDateHeader("Expire", 0);  
        RandomValidateCode randomValidateCode = new RandomValidateCode();  
        try {  
            randomValidateCode.getRandcode(request, response);// 输出图片方法  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }
}

-----------------------------------------------------------默默无闻的分割线-----------------------------------------------------------

  配置web.xml

  <servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>com.shenzhen.management.util.verificationCode.ImageServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/imageServlet.servlet</url-pattern>
  </servlet-mapping>

-----------------------------------------------------------默默无闻的分割线-----------------------------------------------------------

<script type="text/javascript">
    function refresh(obj) {  
        obj.src = "${pageContext.request.contextPath}/imageServlet.servlet?"+Math.random();    
    }
</script>
<title>Hello World</title>
</head>
<body>
   <form action="login" method="post">
        验证码:    
        <input id="validatecode" name="validatecode" type="text" />   
        <img title="看不清楚,换一张?" style="cursor: pointer;" 
            onclick="javascript:refresh(this);" 
            src="${pageContext.request.contextPath}/imageServlet.servlet">
  <input type="submit" value = "提交"/>
   </form>

-----------------------------------------------------------默默无闻的分割线-----------------------------------------------------------

private String validatecode;
public String login(){
            this.message = student.getName();  
            Map session = ActionContext.getContext().getSession();
            String genValidatecode = (String)session.get("RANDOMVALIDATECODEKEY"); //生成的验证码
            System.out.println("validatecode:"+validatecode);//用户输入的验证码

}

-----------------------------------------------------------默默无闻的分割线-----------------------------------------------------------

需要注意的两个问题:1.配置servlet时,为servlet添加一个后缀(.servlet),不然会被Struts2作为Action拦截。

                                   2.调用servlet时,使用绝对路径调用。