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 判断字符为中文实例代码(超管用)

    标题:Java 判断字符为中文实例代码(超管用)攻略 介绍:在Java开发中,有时候需要判断字符是不是中文,本文将详细讲解Java判断字符为中文的实例代码,希望对大家有所帮助。 使用正则表达式判断字符是否为汉字 在Java中,我们可以使用正则表达式来判断字符是否为汉字。我们可以通过Unicode编码范围来表示中文字符,具体方法如下: public stati…

    Java 2023年5月29日
    00
  • 如何基于Java实现对象List排序

    当我们需要对一个对象List进行排序时,可以使用Java提供的Collections.sort()方法来完成排序操作。以下是基于Java实现对象List排序的完整攻略: 1. 定义一个对象类 首先,我们需要定义一个对象类,并实现Comparable接口。比较方式可以根据具体需求进行定义。假设我们要对学生对象进行排序,比较方式为按照学生年龄从小到大排序,则可以…

    Java 2023年5月26日
    00
  • javac、java打jar包命令实例

    下面是Java编译器(javac)、Java解释器(java)和打jar包的命令实例攻略。 javac命令实例 javac命令用于编译Java程序,将源代码编译成可执行的Java字节码文件,该命令的语法格式如下: javac [options] [source files] options:可选参数,比如指定编译器版本、指定输出目录等。 source fil…

    Java 2023年5月19日
    00
  • 如何实现线程安全?

    以下是关于如何实现线程安全的完整使用攻略: 如何实现线程安全? 线程安全是指在多线程环境下,共享资源的访问不会出现数据不一致或者数据污染的问题。为了实现线程安全,可以采取以下措施: 1. 使用同步机制 同步机制是指在多线程环境下,通过加锁的方式来保证共享资源的访问顺序,从而避免数据不一致的问题。常见的同步机制包括 synchronized 关键字、Reent…

    Java 2023年5月12日
    00
  • 关于struts返回对象json格式数据的方法

    关于struts返回对象json格式数据的方法即为使用Struts框架来实现向前端返回JSON格式数据。在Struts框架中,可以使用自带的JSON插件来实现此功能。 具体步骤如下: 步骤一:添加struts-json插件 在Struts的配置文件中添加如下的插件配置: <struts> <constant name="strut…

    Java 2023年5月20日
    00
  • Spring Boot Shiro在Web应用中的作用详解

    Spring Boot Shiro在Web应用中的作用详解 简介 Spring Boot Shiro是基于Spring Boot和Shiro的安全管理框架,可以方便地集成到Web应用中。它提供了一种简单、灵活且强大的身份验证和授权机制,可以在应用中实现多种安全需求,并且易于扩展和定制。 快速开始 依赖 在您的pom.xml文件中添加Spring Boot S…

    Java 2023年6月2日
    00
  • java导出Excel通用方法的实例详解

    Java导出Excel通用方法的实例详解 1. 什么是Java导出Excel通用方法? Java导出Excel通用方法指的是使用Java编写代码来生成Excel文件,是一种常见的数据导出方式。Java导出Excel通用方法主要使用Apache POI库实现,可以生成各种格式的Excel文件。使用Java导出Excel通用方法可以将数据以表格的形式展示,并且可…

    Java 2023年6月2日
    00
  • 使用Spring Boot进行单元测试详情

    使用Spring Boot进行单元测试是保证应用程序质量的重要手段。以下是使用Spring Boot进行单元测试的完整攻略: 添加测试依赖 在Spring Boot中,我们可以使用Maven或Gradle来添加测试依赖。以下是一个Maven的示例: <dependency> <groupId>org.springframework.b…

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