转载/验证码

验证码生成类(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时,使用绝对路径调用。

猜你喜欢

转载自isiah-zhou.iteye.com/blog/2293514