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

    1、在访问登录页面时,需要生产验证码。从而防止用户使用程序恶意操作。

    2、验证码的本质是图片。

    3、生成验证码的工具Servlet,直接复制粘贴即可使用

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    
    @WebServlet("/check")
    public class CheckCodes extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            
            doPost(request,response);
        }
    
        
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //设定长和宽
            int height = 25;
            int width = 80;
            String data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
            Random random = new Random();
            //创建一个图片
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            //获得画板
            Graphics g = image.getGraphics();
            //填充一个矩形
            g.setColor(Color.RED);
            g.fillRect(0, 0, width, height);
            
            g.setColor(Color.WHITE);
            g.fillRect(1, 1, width-2, height-2);
            //设置字体
            g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 25));
            //写随机字
            String code="";
            for(int i = 0 ; i < 4 ; i ++){
                // 设置颜色--随机数
                g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
                // 获得随机字
                int index = random.nextInt(data.length());
                String str = data.substring(index, index + 1);
                code += str;
                // 写入
                g.drawString(str, width / 6 * (i + 1), 20);
            }
            //利用会话跟踪技术,将验证码传入作用域,可以用于验证用户登录
            HttpSession session = request.getSession();
            session.setAttribute("code", code);
    
            //干扰线
            for(int i = 0 ; i < 3 ; i ++){
                // 设置颜色--随机数
                g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
                // 随机绘制先
                g.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width),random.nextInt(height));
                // 随机点
                g.drawOval(random.nextInt(width), random.nextInt(height), 2, 2);
            }
            //将图片返回给浏览器
            ImageIO.write(image, "jpg", response.getOutputStream());
        }
    
    }

    4、网页调用

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript">
        function checkcodeChange(){
            //最后加随机属性是为了刷新路径,不然不会重复刷新验证码
            document.getElementById("checkcode").src="check?test="+Math.random();
        }
    </script>
    </head>
    <body>
    <h1 style="color:red;">${error}</h1>
    <form action="login" method="post">
        用户名:<input type="text" name="username"/><br/>&nbsp;&nbsp;&nbsp;码:<input type="text" name="password" /><br/>
        验证码:<input type="text" name="checkcode" size="4"/>
            <img src="check" onclick="checkcodeChange()"id="checkcode"/><br/>
        <input type="submit" value="提交"/>
    </form>
    </body>
    </html>

    5、登录验证代码

    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import com.bean.User;
    
    
    @WebServlet("/login")
    public class LoginServlet extends HttpServlet {
       
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            response.setContentType("text/html;charset=utf-8");
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String checkcode = request.getParameter("checkcode");
            
            
            HttpSession session = request.getSession();
            String code = (String)session.getAttribute("code");
    
            if(!checkcode.equalsIgnoreCase(code)) {
                session.setAttribute("error", "验证码错误");
                response.sendRedirect("login.html");
                return;
            }
            if ("root".equals(username) && "1234".equals(password)) {
                User user = new User(username, password);
                session.setAttribute("user", user);
                response.sendRedirect("aaa/main.jsp");
            } else {
                session.setAttribute("error", "账户名或密码错误");
                response.sendRedirect("login.html");
            }
            
        }
    
    }        
  • 相关阅读:
    python面向对象三大特性之一封装
    python面向对象的三大特性之一多态
    python之子类调用父类的两种方式
    python之接口继承
    python之组合与继承的使用场景
    Learning to Rank Short Text Pairs with Convolutional Deep Neural Networks(paper)
    lesson9-小象学院cv
    tips
    C5-fasterrcnn-小象cv-code
    C4-ResNet-TF-小象cv-code
  • 原文地址:https://www.cnblogs.com/xfdhh/p/11407263.html
Copyright © 2011-2022 走看看