JavaWeb简单用户登录注册实例代码(有验证码)

下面来详细讲解“JavaWeb简单用户登录注册实例代码(有验证码)”的完整攻略。

1. 需求分析

在开始编写代码前,首先需要明确需求。这个JavaWeb实例主要实现以下功能:

  • 用户注册:包括用户名、密码、确认密码以及验证码;
  • 用户登录:包括用户名、密码以及验证码的校验;
  • 验证码:生成随机数,用户填写后验证;

2. 技术栈

这个JavaWeb实例的技术栈主要包括:

  • Tomcat:用于启动Web应用程序;
  • Servlet:用于处理HTTP请求;
  • JSP:用于向客户端呈现内容;
  • JDBC:用于操作数据库(MySQL);
  • Bootstrap:用于前端页面布局;
  • jQuery:用于前端页面交互。

3. 实现步骤

下面我们将按照一般的JavaWeb实现流程,逐条实现上述功能。

(1)创建数据库

首先,需要创建一个名为“user”的数据库,该数据库包含两个表:user和captcha。其中user表用于存储用户的登录信息,captcha表用于存储验证码图片信息。

(2)实现验证码生成和验证

在JavaWeb中实现验证码一般有两种方法,一种是使用第三方库,另一种是自己编写。我们这里选择自己编写验证码。

在生成验证码图片时,要注意以下几点:(1)验证码可以是数字、字母、符号的组合;(2)验证码图片要设置字体、背景颜色、干扰线等方式,使验证码更难被机器识别。

在提交表单后,需要对用户输入的验证码进行校验,主要是验证用户的输入是否与生成的验证码一致。

(3)实现用户注册

用户注册时,需要向用户展示一个包含用户名、密码、确认密码和验证码的表单,用户填写完毕后提交表单。在提交表单后,需要对用户输入的数据进行验证,并将用户的信息存储到数据库中。

在验证用户输入数据时,要注意以下几点:(1)用户名不能重复;(2)密码和确认密码要一致;(3)验证码要正确。

(4)实现用户登录

用户在登录时,需要输入用户名、密码和验证码。在用户提交表单后,需要对输入的数据进行验证,确保用户名和密码一致,并且验证码正确。

若验证通过,则用户登录成功,否则登录失败。

4. 示例代码

下面的示例代码来自于GitHub上的一个JavaWeb项目,主要实现了用户登录、注册以及验证码生成和验证。具体实现过程和详细注释请见GitHub链接:https://github.com/Yuweh/javaweb_login_demo

(1)生成验证码的示例代码:
@WebServlet("/captcha.jpg")
public class CaptchaServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private static final int WIDTH = 100;
    private static final int HEIGHT = 30;
    private static final int FONT_SIZE = 18;
    private static final int LINE_NUM = 10;
    private static final int POINT_NUM = 100;

    private static final String CODES = "1234567890qwertyuiopasdfghjklzxcvbnm";

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("image/jpeg");
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);

        Graphics graphics = image.getGraphics();
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, WIDTH, HEIGHT);

        graphics.setFont(new Font("Courier New", Font.BOLD, FONT_SIZE));
        StringBuilder codeBuilder = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            int randIndex = new Random().nextInt(CODES.length());
            String rand = CODES.substring(randIndex, randIndex + 1);
            codeBuilder.append(rand);
            graphics.setColor(new Color(new Random().nextInt(256), new Random().nextInt(256), new Random().nextInt(256)));
            graphics.drawString(rand, (i + 1) * 20, HEIGHT / 2 + FONT_SIZE / 2);
        }

        // 干扰线
        for (int i = 0; i < LINE_NUM; i++) {
            graphics.setColor(new Color(new Random().nextInt(256), new Random().nextInt(256), new Random().nextInt(256)));
            graphics.drawLine(new Random().nextInt(WIDTH), new Random().nextInt(HEIGHT), new Random().nextInt(WIDTH), new Random().nextInt(HEIGHT));
        }

        // 干扰点
        for (int i = 0; i < POINT_NUM; i++) {
            graphics.setColor(new Color(new Random().nextInt(256), new Random().nextInt(256), new Random().nextInt(256)));
            graphics.drawOval(new Random().nextInt(WIDTH), new Random().nextInt(HEIGHT), 1, 1);
        }

        request.getSession().setAttribute("captcha", codeBuilder.toString());
        ImageIO.write(image, "jpeg", response.getOutputStream());
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

该示例代码实现了一个验证码生成器,生成的验证码图片包含四个随机字符,颜色随机并带有干扰线和干扰点。将生成的验证码值存储到Session中,供锁屏页面校验使用。

(2)实现用户注册的示例代码:
@WebServlet("/register")
public class RegisterServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF-8";
    // 数据库用户名和密码自行修改
    private static final String USER_NAME = "root";
    private static final String PASSWORD = "root";

    // 判断用户名是否重复,是返回true,否则返回false
    private boolean isUserExist(String username) {
        boolean flag = false;
        try {
            Class.forName(DRIVER_CLASS_NAME);
            Connection conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
            String sql = "select * from user where username=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, username);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                flag = true;
            }
            conn.close();
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return flag;
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String confirmPassword = request.getParameter("confirm_password");
        String captcha = request.getParameter("captcha");

        if (username == null || username.trim().isEmpty() || password == null || password.trim().isEmpty() || !password.equals(confirmPassword) || captcha == null || captcha.trim().isEmpty() || !captcha.equalsIgnoreCase((String) request.getSession().getAttribute("captcha"))) {
            // 用户名或密码为空,或密码和确认密码不一致,或验证码为空,或验证码错误
            response.sendRedirect("register.jsp");
        } else if (isUserExist(username)) {
            // 用户名已存在
            response.sendRedirect("register.jsp?error=exist");
        } else {
            try {
                Class.forName(DRIVER_CLASS_NAME);
                Connection conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
                String sql = "insert into user (username, password) values (?, ?)";
                PreparedStatement ps = conn.prepareStatement(sql);
                ps.setString(1, username);
                ps.setString(2, password);
                ps.executeUpdate();
                conn.close();
                response.sendRedirect("login.jsp?username=" + username);
            } catch (ClassNotFoundException | SQLException e) {
                e.printStackTrace();
                response.sendRedirect("error.jsp");
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

该示例代码实现了用户注册逻辑。在接收到提交的表单数据后,首先判断用户名和密码是否为空以及密码与确认密码是否一致,验证码是否为空或是否正确。如果存在错误,则重定向到注册页面。如果用户名不存在,将用户名和密码存储到数据库中,并重定向到登录页面。

(3)实现用户登录的示例代码:
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/user?useUnicode=true&characterEncoding=UTF-8";
    // 数据库用户名和密码自行修改
    private static final String USER_NAME = "root";
    private static final String PASSWORD = "root";

    // 校验用户名和密码是否正确,是返回true,否则返回false
    private boolean checkUser(String username, String password) {
        boolean flag = false;
        try {
            Class.forName(DRIVER_CLASS_NAME);
            Connection conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
            String sql = "select * from user where username=? and password=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setString(1, username);
            ps.setString(2, password);
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                flag = true;
            }
            conn.close();
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return flag;
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");

        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String captcha = request.getParameter("captcha");

        if (checkUser(username, password) && captcha.equalsIgnoreCase((String) request.getSession().getAttribute("captcha"))) {
            // 登录成功,将用户名存储到Session中
            request.getSession().setAttribute("username", username);
            response.sendRedirect("main.jsp");
        } else {
            // 登录失败,重定向到登录页面
            response.sendRedirect("login.jsp?error=true");
        }

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

该示例代码实现了用户登录逻辑。在接收到提交的表单数据后,首先校验用户名和密码是否正确,验证码是否正确。如果验证通过,则将用户名存储到Session中,并重定向到主页;如果验证失败,则重定向到登录页面。

以上为详细讲解“JavaWeb简单用户登录注册实例代码(有验证码)”的完整攻略,如果还有需要可以再提问。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaWeb简单用户登录注册实例代码(有验证码) - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • 一文掌握SpringSecurity BCrypt密码加密和解密

    一文掌握SpringSecurity BCrypt密码加密和解密 什么是SpringSecurity BCrypt密码加密 SpringSecurity BCrypt密码加密是一种基于BCrypt算法的加密方式。BCrypt算法是一种单向加密算法,它可以用于密码的加密和解密,但解密过程需要很长的时间,通常需要数十年或者更长的时间才能破解。因此,BCrypt算…

    Java 2023年5月20日
    00
  • java类型生命周期的详细解析

    Java类型生命周期的详细解析 Java语言的类型生命周期包括了以下几个阶段:加载(Loading)、链接(Linking)、初始化(Initialization)、使用(Usage)和卸载(Unloading)。在本文中,我们将详细解析Java类型生命周期的每个阶段。 1. 加载 加载阶段是指Java虚拟机(JVM)在需要使用一个类型时,会首先检查该类型是…

    Java 2023年5月26日
    00
  • Java SpringBoot Validation用法案例详解

    这里是关于Java SpringBoot Validation用法的详细攻略。 什么是Java SpringBoot Validation Java SpringBoot Validation是一种用于验证表单输入数据的框架,能够确保数据的合法性和完整性。它能够自动完成JavaBean的数据验证,并且给出友好的错误提示信息。 如何使用Java SpringB…

    Java 2023年5月19日
    00
  • Mybatis如何通过接口实现sql执行原理解析

    Mybatis是一款使用Java对象与数据库之间的映射配置来处理原始SQL的轻量级ORM框架。它可以通过接口实现 SQL 执行原理,实现原理如下: 在Mybatis中,每个mapper接口都对应了一个mapper xml文件。在mapper xml文件中涵盖了众多的SQL语句。 当应用程序访问mapper接口中的方法时,Mybatis会根据方法名去查询map…

    Java 2023年5月20日
    00
  • MyBatis常用动态sql大总结

    “MyBatis常用动态sql大总结”是一篇介绍MyBatis动态SQL的文章,为读者提供了MyBatis动态SQL的基本使用方法和常见应用场景,让读者能够更容易地利用MyBatis实现动态SQL语句的构建。 该文章分为以下几个部分: 简介:介绍MyBatis动态SQL的概念和优势。 基本用法:详细介绍了MyBatis动态SQL的基本使用方法,包括if、ch…

    Java 2023年5月20日
    00
  • Java实现解数独的小程序

    Java实现解数独的小程序攻略 概述 本文将介绍如何使用Java实现一个解数独的小程序。数独是一种数字逻辑游戏,玩家需要填入数字,使得每一行、每一列和每个九宫格内的数字都不重复。 步骤 1. 网格建模 第一步是建立数独网格的模型。我们可以使用一个二维数组,它的每个元素代表数独中的一个格子。元素的值为0表示空格,其他数字表示该格的数值,例如1到9。 int[]…

    Java 2023年5月19日
    00
  • Java读写.properties文件解决中文乱码问题

    下面是我为您提供的Java读写.properties文件解决中文乱码问题的攻略。 1. 问题描述 Java读写.properties文件时,当文件中包含中文时,可能会出现中文乱码问题,这给读取文件内容和使用时带来不便。 2. 解决方案 Java读写.properties文件时,可以采用以下两种方式解决中文乱码问题: 2.1 使用UTF-8编码方式 在读写文件…

    Java 2023年5月20日
    00
  • IntelliJ IDEA设置JVM运行参数的操作方法

    下面是详细的 “IntelliJ IDEA设置JVM运行参数的操作方法”攻略: 什么是JVM运行参数? JVM运行参数指定了在Java应用程序内部运行时,JVM使用的命令行参数。这些参数可以用于调整JVM的行为和性能,例如内存分配,垃圾回收策略,线程数等。在Java应用程序中,可以通过设置JVM运行参数更好地配置JVM,以来优化应用的性能和稳定性。 Inte…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部