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日

相关文章

  • 情人节写给女朋友Java Swing代码程序

    下面是详细的“情人节写给女朋友Java Swing代码程序”的攻略: 1. 确定编写目的 首先需要明确编写这个代码的目的是什么,是为了送给女朋友一份特殊的礼物,还是仅仅练习一些Java Swing编程技巧。这个目的确定好以后,就可以开始进入下一步。 2. 设计程序界面 Java Swing是一种操作系统无关的图形界面工具包,可以方便地实现各种界面。在这一步中…

    Java 2023年5月23日
    00
  • Sprint Boot @Bean使用方法详解

    在Spring Boot中,@Bean是一种用于定义bean的注解。使用@Bean注解可以将一个方法返回的对象注册为Spring应用程序上下文中的bean。本文将详细介绍@Bean注解的作用和使用方法,并提供两个示例说明。 @Bean注解的作用 在Spring Boot中,@Bean注解的作用是将一个方法返回的对象注册为Spring应用程序上下文中的bean…

    Java 2023年5月5日
    00
  • Java中保留两位小数的四种方法实现实例

    以下是Java中保留两位小数的四种方法实现实例的详细讲解攻略: 方法一:使用DecimalFormat类 可以使用Java的DecimalFormat类直接实现保留小数的操作。具体代码如下: double num = 3.141592653589793238; // 原始数据 DecimalFormat df = new DecimalFormat(&quo…

    Java 2023年5月26日
    00
  • SpringBoot整合Freemarker实现页面静态化的详细步骤

    下面是详细的步骤: 1. 创建Spring Boot项目 可以使用Spring Boot官方提供的Spring Initializr快速生成一个基础项目。 2. 添加依赖 在pom.xml文件中添加Freemarker依赖: <dependency> <groupId>org.springframework.boot</grou…

    Java 2023年5月31日
    00
  • Java将Object转换为数组的代码

    要将Java中的Object类型转换成数组,可以使用Java的反射机制来实现。具体的步骤如下: 1. 获取Object的Class对象 通过Object的getClass()方法获取一个Class对象,然后调用Class类的getComponentType()方法获取数组元素的类型,最后调用java.lang.reflect.Array的newInstanc…

    Java 2023年5月26日
    00
  • Tomcat架构设计及Servlet作用规范讲解

    Tomcat是一个基于Java技术开发的Web服务器和Servlet容器,它的主要功能是接收客户端的HTTP请求、处理该请求并向客户端返回HTTP响应。Tomcat的架构设计主要分为三层:底层是Servlet API,中间层是Servlet容器,最上层是Web服务器。 Servlet是一种基于Java技术编写的应用程序,可以通过实现Servlet API的接…

    Java 2023年5月19日
    00
  • SpringBoot整合Swagger框架过程解析

    下面为您详细讲解“SpringBoot整合Swagger框架过程解析”的完整攻略。 什么是Swagger? Swagger是一个开源框架,旨在简化 RESTful Web 服务的开发和文档化,它可以生成能描述API的 JSON、HTML等文档。它包含了一些工具,可以帮助开发人员设计、构建、文档化和使用 RESTful Web 服务。 SpringBoot整合…

    Java 2023年5月19日
    00
  • Java采用setAsciiStream方法检索数据库指定内容实例解析

    让我来详细讲解一下“Java采用setAsciiStream方法检索数据库指定内容实例解析”这个主题。 什么是setAsciiStream方法 在Java JDBC编程中,我们可以使用setAsciiStream方法设置指定内容,该方法是在PreparedStatement接口内定义的方法。setAsciiStream方法的作用是将给定的ASCII输入流转换…

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