JSP + Servlet实现生成登录验证码示例

下面为你讲解如何使用JSP和Servlet实现生成登录验证码。

前置知识

在进行本文的代码实现前,你需要先了解以下技术:

  • Java 编程语言
  • Servlet 技术
  • JSP 技术
  • HTTP 协议

准备工作

在开始代码实现前,请确保你的开发环境中已经正确配置了JSP和Servlet开发环境。这里以Eclipse + Tomcat服务器为例,其他开发环境的配置方法可以自行搜索。

实现步骤

以下是实现JSP和Servlet生成登录验证码的步骤:

第一步:创建Servlet

首先在Eclipse中创建一个Servlet,使用doGet()方法生成验证码,并在session中存储验证码用于后续验证。

@WebServlet("/ImageServlet")
public class ImageServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置页面不缓存
        response.setHeader("Pragma", "No-cache");
        response.setHeader("Cache-Control", "no-cache");
        response.setDateHeader("Expires", 0);
        // 定义验证码的宽度和高度
        int width = 60, height = 20;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        // 生成随机数
        char[] rands = generateCheckCode();
        // 画出验证码
        drawCheckCode(g, rands, width, height);
        // 结束绘制验证码
        g.dispose();
        // 将验证码存入session中
        HttpSession session = request.getSession();
        session.setAttribute("checkCode", new String(rands));
        // 输出验证码到客户端
        ImageIO.write(image, "JPEG", response.getOutputStream());
    }

    // 生成随机验证码
    private char[] generateCheckCode() {
        String chars = "0123456789abcdefghijklmnopqrstuvwxyz";
        char[] rands = new char[4];
        for (int i = 0; i < rands.length; i++) {
            int rand = (int) (Math.random() * chars.length());
            rands[i] = chars.charAt(rand);
        }
        return rands;
    }

    // 绘制验证码
    private void drawCheckCode(Graphics g, char[] rands, int width, int height) {
        for (int i = 0; i < rands.length; i++) {
            g.setColor(Color.BLACK);
            g.drawString(rands[i] + "", (i * 15) + 3, 18);
        }
    }
}

第二步:创建 JSP 页面

接下来创建登录页面,当用户访问登录页面时,生成验证码并将其显示在页面上。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Login Page</title>
    </head>
    <body>
        <form action="login" method="post">
            <label for="username">Username:</label>
            <input type="text" name="username" id="username" required /><br />
            <label for="password">Password:</label>
            <input type="password" name="password" id="password" required /><br />
            <label for="checkCode">Check Code:</label>
            <input type="text" name="checkCode" id="checkCode" required />
            <!-- 显示验证码 -->
            <img src="./ImageServlet" onclick="this.src='./ImageServlet?' + Math.random();" />
            <br />
            <input type="submit" value="Login" />
        </form>
    </body>
</html>

在上面的代码中,我们使用了<img>标签来显示验证码,并且使用onclick事件触发刷新验证码。

第三步:实现登录验证

最后,在Servlet中对用户输入的验证码进行校验,并返回验证结果。

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取用户输入的用户名、密码和验证码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String checkCode = request.getParameter("checkCode");
        // 获取session中存储的验证码
        HttpSession session = request.getSession();
        String sessionCheckCode = (String) session.getAttribute("checkCode");
        // 验证用户名、密码和验证码是否正确
        if ("admin".equals(username) && "123456".equals(password) && checkCode.equals(sessionCheckCode)) {
            response.sendRedirect("success.html"); // 登录成功,跳转到 success.html 页面
        } else {
            response.sendRedirect("failed.html"); // 登录失败,跳转到 failed.html 页面
        }
    }
}

示例说明1

在上面的JSP代码中,我们使用Math.random()方法来实现点击验证码之后的刷新效果。

<img src="./ImageServlet" onclick="this.src='./ImageServlet?' + Math.random();" />

当用户点击验证码时,页面中的<img>标签的src属性将被更新,从而触发重新加载验证码图片。

示例说明2

在上面的Servlet代码中,我们使用response.sendRedirect()方法来实现页面的跳转。

if ("admin".equals(username) && "123456".equals(password) && checkCode.equals(sessionCheckCode)) {
    response.sendRedirect("success.html"); // 登录成功,跳转到 success.html 页面
} else {
    response.sendRedirect("failed.html"); // 登录失败,跳转到 failed.html 页面
}

根据用户输入的用户名、密码和验证码验证结果,Servlet将跳转到不同的页面,即success.htmlfailed.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP + Servlet实现生成登录验证码示例 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • UML类图

    UML类图介绍 概念 UML中的类图(Class Diagram)用于表示类、接口、实例等之间相互的静态关系。虽然名字叫作类图,但是图中并不仅仅只有类。 类结构 继承 该图展示了Parentclass和Childclass两个类之间的关系,其中的空心箭头表明了两者之间的层次关系。箭头由子类指向父类,换言之,这是表示继承(extends)的箭头。ParentC…

    Java 2023年4月22日
    00
  • java获得mysql和oracle链接的类

    连接 MySQL 和 Oracle 数据库在 Java 中可以通过 JDBC API 实现。 JDBC 标准提供了一组接口和实现类来操作数据库,以及获取数据库的连接。下面是完整的攻略: 1. 下载JDBC驱动 MySQL和Oracle都提供了对应的 JDBC 驱动程序,在使用之前,需要先下载对应的版本。可以在官方网站上下载 JDBC 驱动程序,也可以使用 M…

    Java 2023年6月16日
    00
  • 浅谈SpringBoot之事务处理机制

    浅谈SpringBoot之事务处理机制 什么是事务? 事务是指一系列数据库操作(insert、update、delete等),要么全部完成,要么全部回滚,如果其中任何一个操作失败,整个事务将回滚到起点。 在Spring Boot中,可以使用@Transactional注解来声明一个事务,这样在方法执行时就会被视为一个事务,并启用该方法中的所有数据库操作,这个…

    Java 2023年5月15日
    00
  • Java实现的简单数字时钟功能示例

    Java实现的简单数字时钟功能示例,主要涉及到如何使用Java的Date类和SimpleDateFormat类来获取当前时间并在命令行输出数字时钟的界面。下面是一个详细的攻略步骤: 步骤一:创建Java项目 首先需要通过Java开发环境创建一个新的项目,建议使用Eclipse或IntelliJ IDEA等集成开发环境来进行开发。 步骤二:导入Date类和Si…

    Java 2023年5月18日
    00
  • Spring5新特性之Reactive响应式编程

    Spring5新特性之Reactive响应式编程攻略 什么是Reactive响应式编程 传统的编程模型是同步阻塞的,即当程序调用一个方法时,调用者会一直等待该方法执行完毕并返回结果后,才能继续执行后续的操作。这种模型的问题在于,当方法执行时间过长或者被调用的方法处于阻塞状态时,整个应用程序都会处于等待状态,不能及时响应用户的请求,影响了程序的运行效率以及用户…

    Java 2023年5月19日
    00
  • Java的Struts框架报错“ActionForwardNotFoundException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ActionForwardNotFoundException”错误。这个错误通常由以下原因之一起: 配置错误:如果ActionForward配置不正确可能会出现。在这种情况下,需要检查ActionForward配置以解决此问题。 URL路径问题:如果URL路径不正确,则可能会出现此。在种情况下,需要检查URL路…

    Java 2023年5月5日
    00
  • SpringBoot注入自定义的配置文件的方法详解

    当我们开发一个SpringBoot应用时,我们通常需要使用一些配置文件来配置我们的应用程序,例如application.properties或application.yml文件。但是,有时我们需要注入我们自己的配置文件,例如redis.properties或mysql.properties等。那么,本文将介绍如何将自定义配置文件注入到SpringBoot应用…

    Java 2023年5月26日
    00
  • 扩展Hibernate使用自定义数据库连接池的方法

    下面我为你介绍如何扩展Hibernate使用自定义数据库连接池的方法。 概述 在Hibernate中,数据库连接池是默认使用的连接池。但是,也可以通过使用自定义连接池来满足特定的需求。本文将演示如何扩展Hibernate使用自定义数据库连接池的方法。 实现步骤 步骤一:编写自定义连接池类 首先,我们需要编写一个类来实现我们的自定义连接池。这个类需要实现Hib…

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