Servlet+JDBC实现登陆功能的小例子(带验证码)

下面是“Servlet+JDBC实现登陆功能的小例子(带验证码)”的完整攻略,包含以下内容:

需求分析

我们需要实现一个包含验证码的登陆功能,用户需要输入用户名、密码和验证码,当用户点击提交按钮时,系统会校验用户的输入,如果输入正确,则跳转到登录成功页面,否则提示错误信息。

技术选择

我们使用Servlet技术实现用户输入数据的接收和校验,使用JDBC技术实现数据的存储和查询,使用JSP技术实现登录成功页面的展示。

开发步骤

步骤一:创建数据库和数据表

在MySQL数据库中创建一个名为“test”的数据库,并在该数据库中创建一个名为“user”的数据表,该数据表包含以下字段:

  • id(int):主键字段;
  • username(varchar):用户名字段;
  • password(varchar):密码字段。

步骤二:创建JavaBean类

创建一个JavaBean类User,用于表示用户信息,该类的代码如下:

public class User {
    private int id;
    private String username;
    private String password;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

步骤三:编写DAO层代码

编写一个UserDAO类,用于实现与数据库的数据交互,该类的代码如下:

public class UserDAO {
    private Connection conn = null;
    private PreparedStatement ps = null;
    private ResultSet rs = null;

    // 连接数据库方法
    private void getConn() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/test";
        String username = "root";
        String password = "root";
        conn = DriverManager.getConnection(url, username, password);
    }

    // 关闭数据库方法
    private void closeConn() throws Exception {
        if (rs != null) {
            rs.close();
        }
        if (ps != null) {
            ps.close();
        }
        if (conn != null) {
            conn.close();
        }
    }

    // 查询用户方法
    public User getUser(String username, String password) throws Exception {
        getConn();
        String sql = "select * from user where username=? and password=?";
        ps = conn.prepareStatement(sql);
        ps.setString(1, username);
        ps.setString(2, password);
        rs = ps.executeQuery();
        User user = null;
        while (rs.next()) {
            user = new User();
            user.setId(rs.getInt("id"));
            user.setUsername(rs.getString("username"));
            user.setPassword(rs.getString("password"));
        }
        closeConn();
        return user;
    }

    // 保存用户方法
    public void saveUser(User user) throws Exception {
        getConn();
        String sql = "insert into user (username,password) values(?,?)";
        ps = conn.prepareStatement(sql);
        ps.setString(1, user.getUsername());
        ps.setString(2, user.getPassword());
        ps.executeUpdate();
        closeConn();
    }
}

步骤四:编写Servlet代码

编写一个LoginServlet类,用于实现用户登录的功能,包括输入数据的接收和校验,验证码的生成和校验,以及页面的跳转等,该类的代码如下:

public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // 生成指定长度的随机字符串
    private String getRandomString(int length) {
        String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < length; i++) {
            int number = random.nextInt(62);
            sb.append(str.charAt(number));
        }
        return sb.toString();
    }

    //生成验证码图片
    private void outputCaptcha(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 设置响应的类型格式为图片格式
        response.setContentType("image/jpeg");
        //禁止图像缓存。
        response.setHeader("Cache-Control", "no-store");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", 0);

        int width = 80, height = 30;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        Graphics g = image.getGraphics();
        Random random = new Random();
        g.setColor(getRandColor(200, 250));
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
        g.setColor(getRandColor(160, 200));
        for (int i = 0; i < 155; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x, y, x + xl, y + yl);
        }

        String captcha = getRandomString(4);
        request.getSession().setAttribute("captcha", captcha);
        g.setFont(new Font("Arial", Font.BOLD, 20));
        g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
        g.drawString(captcha, 15, 25);
        g.dispose();

        ImageIO.write(image, "JPEG", response.getOutputStream());
    }

    //获取给定范围内的随机颜色
    private Color getRandColor(int fc, int bc) {
        Random random = new Random();
        if (fc > 255)
            fc = 255;
        if (bc > 255)
            bc = 255;
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String captcha = request.getParameter("captcha");
        String sessionCaptcha = (String) request.getSession().getAttribute("captcha");
        if (captcha == null || !captcha.equals(sessionCaptcha)) {
            request.setAttribute("message", "验证码错误");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return;
        }
        UserDAO dao = new UserDAO();
        User user = null;
        try {
            user = dao.getUser(username, password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (user == null) {
            request.setAttribute("message", "用户名或密码错误");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        } else {
            request.getRequestDispatcher("/success.jsp").forward(request, response);
        }
    }
}

步骤五:编写验证码页面代码

编写一个captcha.jsp页面,用于显示验证码图片,该页面的代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.awt.*,java.awt.image.*"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Captcha</title>
</head>
<body>
    <img src="loginServlet?method=outputCaptcha" onclick="this.src='loginServlet?method=outputCaptcha&' + Math.random();" />
</body>
</html>

步骤六:编写登录页面代码

编写一个login.jsp页面,用于输入用户名、密码和验证码,该页面的代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
    <form action="loginServlet" method="post">
        <label>用户名:</label><input type="text" name="username" /><br />
        <label>密&nbsp;&nbsp;&nbsp;码:</label><input type="password" name="password" /><br />
        <label>验证码:</label><input type="text" name="captcha" /><img src="captcha.jsp" /><br />
        <input type="submit" value="登录" />
    </form>
    <% if (request.getAttribute("message") != null) { %>
        <p><%= request.getAttribute("message") %></p>
    <% } %>
</body>
</html>

步骤七:编写登录成功页面代码

编写一个success.jsp页面,用于显示登录成功的信息,该页面的代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login Success</title>
</head>
<body>
    <h1>Login Success</h1>
    <p>欢迎您,<%= request.getParameter("username") %>!</p>
</body>
</html>

示例说明

示例一:正确输入用户名、密码和验证码登录

  1. 打开浏览器,访问登录页面,如:http://localhost:8080/login.jsp
  2. 输入正确的用户名和密码,输入正确的验证码,点击登录按钮
  3. 系统提示登录成功,跳转到成功页面,展示登录的用户名信息

示例二:输入错误的验证码

  1. 打开浏览器,访问登录页面,如:http://localhost:8080/login.jsp
  2. 输入正确的用户名和密码,输入错误的验证码,点击登录按钮
  3. 系统提示验证码错误,重新输入正确的验证码,或刷新验证码重新获取

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Servlet+JDBC实现登陆功能的小例子(带验证码) - Python技术站

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

相关文章

  • Java导出txt文件的方法

    下面为您详细讲解Java导出txt文件的方法的完整攻略。 1.导出txt文件的方法 1.1 使用FileWriter类 在Java中,可以使用FileWriter类来导出txt文件。FileWriter类提供了write()方法,可以将字符串写入文件。 具体实现步骤如下: 创建FileWriter类对象,用于指定txt文件的路径。 FileWriter fi…

    Java 2023年5月20日
    00
  • mybatis水平分表实现动态表名的项目实例

    本文将详细讲解如何通过MyBatis水平分表实现动态表名的项目实例。 什么是MyBatis水平分表? MyBatis水平分表是指将同一张表中的数据拆分到不同的物理表中,通常采用后缀方式实现。例如,将订单表按年份拆分为多个表,命名规则为:order_2019, order_2020, order_2021…。 MyBatis水平分表的主要目的是解决表数据过…

    Java 2023年5月20日
    00
  • Java中Arrays类与Math类详解

    Java中Arrays类与Math类详解 在Java中,Arrays类和Math类是常用的工具类,主要提供了一些静态方法来方便我们进行数组、数值计算等操作。 Arrays类 Arrays类提供了很多有用的方法来进行数组的操作,包括数组的排序、查找、复制等。 数组排序 排序算法 Arrays类中提供了sort()方法来对数组进行排序,在方法中我们可以通过传入C…

    Java 2023年5月26日
    00
  • Java进阶之FileUpload完成上传的实例

    Java进阶之FileUpload完成上传的实例 File Upload(文件上传)是Web应用程序中常用的功能之一,可以让用户将自己的文件上传到服务器。本文将介绍如何使用Java来实现文件上传功能。 实现流程 1.创建表单 首先,在前端编写一个表单,用来选择要上传的文件: <form action="upload" method=…

    Java 2023年6月2日
    00
  • 详解Java如何使用集合来实现一个客户信息管理系统

    详解Java如何使用集合来实现一个客户信息管理系统 1. 概述 在Java中,可以使用集合类来实现一个简单的客户信息管理系统。集合类提供了丰富的数据结构和操作方法,能够满足各种需求。 我们可以使用List或Set来存储客户信息,在程序中实现增删改查等操作。同时,我们可以利用Map来存储客户信息,实现键值对的存储,方便以后的查找和遍历。 2. 使用List实现…

    Java 2023年5月30日
    00
  • jquery ajax 局部刷新小案例

    首先,让我们了解一下jQuery的ajax方法,该方法允许我们通过JavaScript代码向服务器发送异步HTTP请求,并在服务器响应事件时更新部分页面内容,使得页面刷新更快,用户体验更加顺畅。 接下来,我们将介绍一个jquery ajax的小案例,以帮助您更好地理解如何使用jQuery和ajax来实现局部刷新。 一、案例需求 我们的网站有一个评论区,用户可…

    Java 2023年6月15日
    00
  • SpringBoot如何手写一个starter并使用这个starter详解

    Spring Boot 如何手写一个 Starter 并使用这个 Starter 的完整攻略 在本文中,我们将详细讲解如何手写一个 Spring Boot Starter 并使用这个 Starter 的完整攻略。我们将使用 Spring Boot、Maven 和自定义 Starter 来实现这个工具。 步骤一:创建 Maven 项目 首先,我们需要一个 Ma…

    Java 2023年5月15日
    00
  • JavaEE账号注册模拟网站邮箱激活

    JavaEE账号注册模拟网站邮箱激活是一个常见的Web应用程序开发需求。具体实现这个功能的步骤如下: 1. 搭建Web应用程序 首先,需要搭建一个基于JavaEE的Web应用程序,这个应用程序会充当网站的后端服务器,接收客户端请求并返回数据。可以使用诸如Tomcat、Jetty等开源的Web服务器来搭建这个Web应用程序。 2. 设计数据库 建立数据库表,通…

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