zoukankan      html  css  js  c++  java
  • java实现登录验证码

    java实现登录验证码:用兴趣的同学

        可以参考一下:

    VerifyCodeServlet.java类:

    package com.spring.controller;
    
    import java.awt.Color;         
    import java.awt.Font;         
    import java.awt.Graphics2D;         
    import java.awt.image.BufferedImage;         
    import java.util.Random;         
            
    import javax.imageio.ImageIO;         
    import javax.servlet.ServletException;         
    import javax.servlet.ServletOutputStream;         
    import javax.servlet.http.HttpServlet;         
    import javax.servlet.http.HttpServletRequest;         
    import javax.servlet.http.HttpServletResponse;         
    import javax.servlet.http.HttpSession;  
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    
    @Controller
    public class VerifyCodeServlet extends HttpServlet {
    	
    	 // 验证码图片的宽度。         
        private int width = 60;         
            
        // 验证码图片的高度。         
        private int height = 20;         
            
        // 验证码字符个数         
        private int codeCount = 4;         
            
        private int x = 0;         
            
        // 字体高度         
        private int fontHeight;         
            
        private int codeY;         
            
        char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',         
                'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',         
                'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };         
            
        /**       
         * 初始化验证图片属性       
         */        
        public void initxuan() throws ServletException {         
            // 从web.xml中获取初始信息         
            // 宽度         
            String strWidth ="80";         
            // 高度         
            String strHeight ="30";         
            // 字符个数         
            String strCodeCount = "4";         
            
            // 将配置的信息转换成数值         
            try {         
                if (strWidth != null && strWidth.length() != 0) {         
                    width = Integer.parseInt(strWidth);         
                }         
                if (strHeight != null && strHeight.length() != 0) {         
                    height = Integer.parseInt(strHeight);         
                }         
                if (strCodeCount != null && strCodeCount.length() != 0) {         
                    codeCount = Integer.parseInt(strCodeCount);         
                }         
            } catch (NumberFormatException e) {         
            }         
            
            x = width / (codeCount + 1);         
            fontHeight = height - 2;         
            codeY = height - 4;         
            
        }   
        
        @RequestMapping(value="xuan/verifyCode",method=RequestMethod.GET)
        public void service(HttpServletRequest req, HttpServletResponse resp)         
                throws ServletException, java.io.IOException { 
        	
            initxuan();
            // 定义图像buffer         
            BufferedImage buffImg = new BufferedImage(width, height,         
                    BufferedImage.TYPE_INT_RGB);         
            Graphics2D g = buffImg.createGraphics();         
            
            // 创建一个随机数生成器类         
            Random random = new Random();         
            
            // 将图像填充为白色         
            g.setColor(Color.WHITE);         
            g.fillRect(0, 0, width, height);         
            
            // 创建字体,字体的大小应该根据图片的高度来定。         
            Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);         
            // 设置字体。         
            g.setFont(font);         
            
            // 画边框。         
            g.setColor(Color.BLACK);         
            g.drawRect(0, 0, width - 1, height - 1);         
            
            // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。         
            g.setColor(Color.BLACK);         
            for (int i = 0; i < 10; i++) {         
                int x = random.nextInt(width);         
                int y = random.nextInt(height);         
                int xl = random.nextInt(12);         
                int yl = random.nextInt(12);         
                g.drawLine(x, y, x + xl, y + yl);         
            }         
            
            // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。         
            StringBuffer randomCode = new StringBuffer();         
            int red = 0, green = 0, blue = 0;         
            
            // 随机产生codeCount数字的验证码。         
            for (int i = 0; i < codeCount; i++) {         
                // 得到随机产生的验证码数字。         
                String strRand = String.valueOf(codeSequence[random.nextInt(36)]);         
                // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。         
                red = random.nextInt(255);         
                green = random.nextInt(255);         
                blue = random.nextInt(255);         
            
                // 用随机产生的颜色将验证码绘制到图像中。         
                g.setColor(new Color(red, green, blue));         
                g.drawString(strRand, (i + 1) * x, codeY);         
            
                // 将产生的四个随机数组合在一起。         
                randomCode.append(strRand);         
            }         
            // 将四位数字的验证码保存到Session中。         
            HttpSession session = req.getSession();         
            session.setAttribute("validateCode", randomCode.toString());         
            
            // 禁止图像缓存。         
            resp.setHeader("Pragma", "no-cache");         
            resp.setHeader("Cache-Control", "no-cache");         
            resp.setDateHeader("Expires", 0);         
            
            resp.setContentType("image/jpeg");         
            
            // 将图像输出到Servlet输出流中。         
            ServletOutputStream sos = resp.getOutputStream();         
            ImageIO.write(buffImg, "jpeg", sos);         
            sos.close();         
        }         
    
    }
    


    ResultServlet.java:

    package com.spring.controller;
    
    import java.io.IOException;         
    import java.io.PrintWriter;         
            
    import javax.servlet.ServletException;                
    import javax.servlet.http.HttpServletRequest;         
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    
    
    @Controller
    public class ResultServlet {
    	
    
    	    @RequestMapping(value="resultServlet/validateCode",method=RequestMethod.POST)
    	    public void doPost(HttpServletRequest request, HttpServletResponse response)         
    	            throws ServletException, IOException {         
    	        
    	        response.setContentType("text/html;charset=utf-8");         
    	        String validateC = (String) request.getSession().getAttribute("validateCode");         
    	        String veryCode = request.getParameter("c");         
    	        PrintWriter out = response.getWriter();         
    	        if(veryCode==null||"".equals(veryCode)){         
    	            out.println("验证码为空");         
    	        }else{         
    	            if(validateC.equals(veryCode)){         
    	                out.println("验证码正确");         
    	            }else{         
    	                out.println("验证码错误");         
    	            }         
    	        }         
    	        out.flush();         
    	        out.close();         
    	    }         
       
    	
    }
    


    jsp页面:

    <%@ page language="java" contentType="text/html; charset=UTF-8"       
        pageEncoding="UTF-8"%>       
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">       
    <html>       
        <head>       
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>test verify code</title>  
            
    
        </head>  
        
        
    
        
             
        <body>       
            <input id="veryCode" name="veryCode" type="text"/>       
            <img id="imgObj"  alt="" src="xuan/verifyCode"/>       
            <a href="#" onclick="changeImg()">换一张</a>       
            <input type="button" value="验证" onclick="isRightCode()"/>       
            <div id="info"></div>       
        </body>       
    </html>
    
    <script type="text/javascript">
     function changeImg(){     
        var imgSrc = $("#imgObj");     
        var src = imgSrc.attr("src");     
        imgSrc.attr("src",chgUrl(src));     
    }     
    //时间戳     
    //为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳     
    function chgUrl(url){     
        var timestamp = (new Date()).valueOf();     
        urlurl = url.substring(0,17);     
        if((url.indexOf("&")>=0)){     
            urlurl = url + "×tamp=" + timestamp;     
        }else{     
            urlurl = url + "?timestamp=" + timestamp;     
        }     
        return url;     
    }     
        
    function isRightCode(){     
        var code = $("#veryCode").attr("value");     
        code = "c=" + code;     
        $.ajax({     
            type:"POST",     
            url:"resultServlet/validateCode",     
            data:code,     
            success:callback     
        });     
    }     
        
    function callback(data){     
        $("#info").html(data);     
    }  
            
    </script>  



    运行效果:



  • 相关阅读:
    原生js 实现 map
    前端安全学习
    前端性能优化
    前端的跨域请求方法使用场景及各自的局限性
    7-7 12-24小时制(15 分)
    7-4 BCD解密(10 分)
    7-2 然后是几点(15 分)
    厘米换算英尺英寸
    鸡兔同笼
    数组:经典计数
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3371921.html
Copyright © 2011-2022 走看看