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

下面来详细讲解“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简单用户登录注册实例代码(有验证码)

基础教程推荐