zoukankan      html  css  js  c++  java
  • Java简单验证码原理(源代码+步骤操作)

    本文章一共分为五个步骤,具体操作流程如下:

    一、新建名为:CheckCodeServlet的servlet类;

    二、复制以下代码到新建的CheckCodeServlet类中,修改自己的包名:

    package com.seesun2012.Servlet; //这里是我的包名
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Random;
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class CheckCodeServlet extends HttpServlet {
        //产生随即的字体
        private Font getFont() {
            //创建random对象用来生成随机数
            Random random = new Random();
            //创建字体数组,用来装不同的字体的Font对象
            Font font[] = new Font[5];  
            font[0] = new Font("Ravie", Font.PLAIN, 24);  
            font[1] = new Font("Antique Olive Compact", Font.PLAIN, 24);  
            font[2] = new Font("Forte", Font.PLAIN, 24);  
            font[3] = new Font("Wide Latin", Font.PLAIN, 24);  
            font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 24);  
            return font[random.nextInt(5)];  
        }  
      
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
                throws ServletException, IOException {  
            // 设置响应头 Content-type类型  
            resp.setContentType("image/jpeg");  
            OutputStream os = resp.getOutputStream();  
            int width = 83, height = 30;  
            // 建立指定宽、高和BufferedImage对象  
            BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);  
      
            Graphics g = image.getGraphics(); // 该画笔画在image上  
            Color c = g.getColor(); // 保存当前画笔的颜色
            //填充矩形
            g.fillRect(0, 0, width, height);  
            // 随即产生的字符串 不包括 i l(小写L) o(小写O) 1(数字1)0(数字0) 
            char[] ch = "abcdefghjkmnpqrstuvwxyz2345678901".toCharArray(); 
            int length = ch.length; // 随即字符串的长度  
            String sRand = ""; // 保存随即产生的字符串  
            Random random = new Random();  
            for (int i = 0; i < 4; i++) {
                // 设置字体  
                g.setFont(getFont());  
                // 随即生成0-9的数字  
                String rand = new Character(ch[random.nextInt(length)]).toString();  
                sRand += rand;  
                // 设置随机颜色  
                g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));  
                g.drawString(rand, 20 * i + 6, 25);  
            }
            //产生随即干扰点  
            for (int i = 0; i < 20; i++) {  
                int x1 = random.nextInt(width);  
                int y1 = random.nextInt(height);  
                g.drawOval(x1, y1, 2, 2);  
            }  
             // 将画笔的颜色再设置回去  
            g.setColor(c); 
            // 释放此图形的上下文以及它使用的所有系统资源。
            g.dispose();  
      
            //将验证码记录到session  
            req.getSession().setAttribute("safecode", sRand);  
            // 输出图像到页面  
            ImageIO.write(image, "JPEG", os);  
        }  
      
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
                throws ServletException, IOException {  
            doGet(req, resp);  
        }  
    }
    

    三、在页面中JSP页面中添加如下JavaScript代码(前提必须引用jquery-1.11.0.min.js脚本):

    <script type="text/javascript">
        function changeImg() {
            var imgObj = document.getElementById("img");
            imgObj.src = "CheckCodeServlet?ran=" + Math.random();
        }
    </script>
    

    四、在body标签中的添加,post为提交方式:

    <form action="所要进行处理的和验证Servlet名称" id="commentForm" method="post">
        <span class="login_txt">验证码:</span>
        <input class=“” name="code" type="rext" value="" maxLength=4 size=10 /> 
        <img src="CheckCodeServlet" id="img" class="yzm" width="109" height="40" /> 
        <a href="javascript:changeImg()" class="login-text03">看不清楚,换张图片</a>
    </form>
    

    五、通过文本框的name属性,在Servlet中获取页面传过来的值,代码如下:

    public class UserInfoManager extends HttpServlet {
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        
            /*
             * 获取页面传过来的参数(验证码)
             * 
             * 这里的“code”为<input class=“” name="code" 
             * type="rext" value="" maxLength=4 size=10 /> 中的name属性名
             */
            String code=request.getParameter("code");
            System.out.println(code);//控制台打印传过来的code值
            HttpSession session=request.getSession();//初始化Session
            //获取的验证码
            String sessionCode=(String)session.getAttribute("safecode");
            //打印从CheckCodeServlet 类获取随即生成的验证码参数
            System.out.println(sessionCode);
            //判断用户输入的验证码与随机产生的验证码是否对应
            if (!(sessionCode.equals(code))) {
                //验证验证码不正确的情况
                request.setAttribute("msg", "对不起验证码不正确");//提示内容
                //如果不正确返回一个提示(msg)给页面,在login.jsp页面利用${msg}显示提示
                request.getRequestDispatcher("login.jsp").forward(request, response);
            } else {
                //验证成功
                String msg=request.getParameter("account");
                request.setAttribute("msg",msg);
                session.setAttribute("account", account);
                //页面跳转
                request.getRequestDispatcher("admin.jsp").forward(request, response);
                System.out.println("登陆成功!");  //控制台测试是否登录成功!
            }
        }
    }
    
  • 相关阅读:
    May 1 2017 Week 18 Monday
    April 30 2017 Week 18 Sunday
    April 29 2017 Week 17 Saturday
    April 28 2017 Week 17 Friday
    April 27 2017 Week 17 Thursday
    April 26 2017 Week 17 Wednesday
    【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式
    April 25 2017 Week 17 Tuesday
    April 24 2017 Week 17 Monday
    为什么丑陋的UI界面却能创造良好的用户体验?
  • 原文地址:https://www.cnblogs.com/seesun2012/p/9214623.html
Copyright © 2011-2022 走看看