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

yizhihongxing

下面来详细讲解“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日

相关文章

  • 老生常谈java数组中的常见异常

    讲解“老生常谈java数组中的常见异常”的完整攻略,可以按照以下步骤进行: 1. 数组越界异常(ArrayIndexOutOfBoundsException) 这个异常是在数组下标超过数组的长度时发生的异常,下标从0开始,数组长度是从1开始,因此我们需要通过下标加减一来判断是否存在这个下标。 int[] array = {1, 2, 3, 4, 5}; in…

    Java 2023年5月26日
    00
  • java mybatis框架配置详解

    Java MyBatis框架配置详解 1. 简介 MyBatis是一个用Java编写的开源ORM(object relational mapping)框架。它通过XML或注解方式向数据库发送SQL语句,执行相应的操作,并将结果映射到Java对象中。 MyBatis具有以下优点: 灵活性较高,可以使用纯SQL,减少了ORM框架带来的性能压力。 可以进行批处理,…

    Java 2023年5月20日
    00
  • 通过js动态创建标签,并设置属性方法

    通过js动态创建标签并设置属性方法是一个常见的操作。下面是这个过程的详细攻略: 1. 创建元素 要动态创建标签,我们需要使用JavaScript中的createElement()方法。该方法用于创建新的HTML元素,并指定元素的标签名称。例如,创建一个 元素可以使用以下代码: const paragraph = document.createElement(…

    Java 2023年6月15日
    00
  • Java JTable 实现日历的示例

    这里提供一个Java JTable 实现日历的示例的完整攻略: 1. 实现一个基本的日历 步骤一:创建一个 JFrame,并添加一个 JTable,用来显示日历 public class Calendar extends JFrame { private final int WIDTH = 600; private final int HEIGHT = 40…

    Java 2023年5月20日
    00
  • 关于java命令的本质逻辑揭秘过程

    关于 Java 命令的本质逻辑揭秘过程 Java 命令是用于启动 Java 应用程序的命令行工具,它具有很多可选项和参数,让你可以控制不同方面的应用程序行为。在深入探究 Java 命令的本质逻辑之前,首先需要了解 Java 应用程序的基本结构和运行方式。 Java 应用程序的基本结构 Java 应用程序的基本结构通常由以下三个部分组成: 包声明:一般位于 J…

    Java 2023年5月23日
    00
  • Java 数组高频考点分析讲解

    Java 数组高频考点分析讲解 数组是Java中非常重要的数据类型,经常被用于开发过程中。下面我们来详细讲解Java数组的高频考点,以帮助读者更好地掌握数组的使用。 数组概述 数组是一种存储同类型元素的数据结构,它是在程序中声明的一个固定大小的、连续存储的元素集合。在Java中,数组是一个对象,由一块连续的内存空间组成,可以存储多个相同数据类型的元素。 数组…

    Java 2023年5月26日
    00
  • Java文件读写详解

    Java文件读写是Java中常见的操作之一,在Java中读写文件过程需要经过三个步骤:打开文件、读取或写入文件、关闭文件。本文将详细介绍Java文件读写的所有操作及示例。 打开文件 在Java程序中打开文件需要使用Java IO类库。其中FileInputStream和FileOutputStream是Java IO中最常用的两个类。下面分别介绍这两个类在打…

    Java 2023年5月20日
    00
  • Java 动态加载jar和class文件实例解析

    以下是详细讲解“Java 动态加载jar和class文件实例解析”的完整攻略: 动态加载jar和class文件 动态加载jar和class文件可以让我们在运行时根据需要动态地加载类和更新代码,可以方便地实现插件式开发和动态扩展应用程序。在Java中,动态加载jar和class文件有多种方式,包括URLClassLoader、Class.forName()等。…

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