首页 > 代码库 > 验证码的实现

验证码的实现

function _hyz()//换一张函数JS代码
     {
         /*
         1. 获取<img>元素
         2. 给它的src指向/tools/VerifyCodeServlet
         */
         var img=document.getElementById("imgVerifyCode");
         //需要给出一个参数,这个参数每次都不同,这样才能刷新浏览器缓存!
         img.src = "/tools/VerifyCodeServlet?a="+ new Date().getTime();
     }
//jsp中代码
验证码:<input type="text" name="verifyCode"/><br>  
 <img src="http://www.mamicode.com/tools/VerifyCodeServlet" id="imgVerifyCode"/>
 <a href="javascript:_hyz()">换一张</a><br>
 //servlet中使用验证码代码
public String login(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /*
         * 校验验证码
         *   1.获取表单中的验证码
         *   2.获取图片上的文字
         */
        String verifyCode =request.getParameter("verifyCode");
        //VerifyCodeServlet会把真正的验证码保存到session中
        String vcode =(String) request.getSession().getAttribute("vCode");//
 
        System.out.println(vcode+"  "+verifyCode);
        System.out.println(verifyCode.equalsIgnoreCase(vcode));//不区分大小写比较
 
        return null;
    }
//生成验证码的过程JAVA代码
public class VerifyCode {
    private int w = 70;
    private int h = 35;
     private Random r = new Random();
     // {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}
    private String[] fontNames  = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};
    private String codes  = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
    private Color bgColor  = new Color(255, 255, 255);
    private String text ;
 
    private Color randomColor () {
        int red = r.nextInt(150);
        int green = r.nextInt(150);
        int blue = r.nextInt(150);
        return new Color(red, green, blue);
    }
 
    private Font randomFont () {
        int index = r.nextInt(fontNames.length);
        String fontName = fontNames[index];
        int style = r.nextInt(4);
        int size = r.nextInt(5) + 24; 
        return new Font(fontName, style, size);
    }
 
    private void drawLine (BufferedImage image) {
        int num  = 3;
        Graphics2D g2 = (Graphics2D)image.getGraphics();
        for(int i = 0; i < num; i++) {
            int x1 = r.nextInt(w);
            int y1 = r.nextInt(h);
            int x2 = r.nextInt(w);
            int y2 = r.nextInt(h); 
            g2.setStroke(new BasicStroke(1.5F)); 
            g2.setColor(Color.BLUE); 
            g2.drawLine(x1, y1, x2, y2);
        }
    }
 
    private char randomChar () {
        int index = r.nextInt(codes.length());
        return codes.charAt(index);
    }
 
    private BufferedImage createImage () {
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
        Graphics2D g2 = (Graphics2D)image.getGraphics(); 
        g2.setColor(this.bgColor);
        g2.fillRect(0, 0, w, h);
         return image;
    }
 
    public BufferedImage getImage () {
        BufferedImage image = createImage(); 
        Graphics2D g2 = (Graphics2D)image.getGraphics();
        StringBuilder sb = new StringBuilder();
        // 向图片中画4个字符
        for(int i = 0; i < 4; i++)  {
            String s = randomChar() + ""; 
            sb.append(s); 
            float x = i * 1.0F * w / 4; 
            g2.setFont(randomFont()); 
            g2.setColor(randomColor()); 
            g2.drawString(s, x, h-5); 
        }
        this.text = sb.toString(); 
        drawLine(image); 
        return image;        
    }
 
    public String getText () {
        return text;
    }
 
    public static void output (BufferedImage image, OutputStream out) 
                throws IOException {
        ImageIO.write(image, "JPEG", out);
    }
public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        VerifyCode vc = new VerifyCode();
        BufferedImage image = vc.getImage();//获取一次性验证码图片
        // 该方法必须在getImage()方法之后来调用
//        System.out.println(vc.getText());//获取图片上的文本
        VerifyCode.output(image, response.getOutputStream());//把图片写到指定流中
        // 把文本保存到session中,为LoginServlet验证做准备
        request.getSession().setAttribute("vCode", vc.getText());
    }
 
 
 

验证码的实现