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日

相关文章

  • Java中的BufferedInputStream与BufferedOutputStream使用示例

    Java中的BufferedInputStream与BufferedOutputStream使用示例攻略 1. BufferedInputStream BufferedInputStream是Java I/O库中常用的一个类,它是一个缓冲输入流,在内存中维护一个缓冲区,每次从文件中读取数据时,它会先从缓冲区中读取,当缓冲区中数据不足时再读取文件,提高了I/O…

    Java 2023年5月26日
    00
  • Spring Security的过滤器链机制

    Spring Security 是 Spring 提供的一个重要的安全框架,可以方便地实现安全认证和授权等功能。其中最核心的特性是 Spring Security 的过滤器链机制。 什么是过滤器链 Spring Security 的过滤器链机制是指将一组过滤器串联起来,对指定的请求进行逐个过滤处理,以完成功能的实现和安全保障。 Spring Security…

    Java 2023年5月20日
    00
  • Android中ArrayList和数组相互转换

    下面我就来详细讲解一下“Android中ArrayList和数组相互转换”的完整攻略,包含以下内容: 将数组转换成ArrayList 将ArrayList转换成数组 示例说明:数组转ArrayList 示例说明:ArrayList转数组 将数组转换成ArrayList 如果我们需要使用ArrayList来操作数组,那么就需要将数组转换成ArrayList。下…

    Java 2023年5月26日
    00
  • 关于@Query注解的用法(Spring Data JPA)

    当我们使用 Spring Data JPA 进行数据库操作时,经常需要根据特定的条件查询数据,@Query 注解可以用来定义自定义查询语句,让我们可以像原生 SQL 语句一样写出灵活的查询语句。下面是 @Query 注解的详细介绍和使用方法。 什么是 @Query 注解 @Query 是 Spring Data JPA 提供的一种查询注解,用来定义自定义查询…

    Java 2023年5月20日
    00
  • Java使用JSONObject操作json实例解析

    下面我将为你详细讲解Java使用JSONObject操作json实例解析的完整攻略。 什么是JSONObject 在Java中操作json数据需要用到第三方库,其中一个流行的库是JSON-java。而JSONObject就是JSON-java库中的一个类,用于操作Json格式的数据。 导入JSON-java库 在使用JSON-java库前,需要先将其导入到项…

    Java 2023年5月26日
    00
  • Java基础之教你如何正确运用依赖注入

    Java基础之教你如何正确运用依赖注入 什么是依赖注入? 依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这个模式中,对象在被创建的时候所需的依赖关系被动态注入到对象中。这种方式有助于减少模块之间的耦合性,同时也增强了代码的可扩展性和可维护性。 依赖注入的三种方式 依赖注入有三种方式:构造器注入,Setter注入和接口注入…

    Java 2023年5月27日
    00
  • SpringBoot整合Apache Ignite的实现

    Spring Boot 整合 Apache Ignite 的过程可以分为以下几个步骤: 引入依赖 在 pom.xml 文件中添加如下依赖: <dependency> <groupId>org.apache.ignite</groupId> <artifactId>ignite-core</artifact…

    Java 2023年5月19日
    00
  • Java由浅入深细数数组的操作上

    Java数组操作完整攻略 一、数组概述 Java数组是一种包含固定数量元素的数据结构,这些元素属于同一种数据类型。 Java数组由以下几个基本点组成: 数组声明 数组的创建 数组的初始化 数组的访问 数组的遍历 二、数组的声明 Java中数组的声明包含两个重要的部分,第一部分是数组的类型,第二部分是数组的名字。如下所示: int[] arr; //第一种声明…

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