JSP验证码动态生成方法

JSP验证码动态生成方法

验证码是一种基于图像识别的人机交互技术,用于防止机器恶意提交表单、暴力破解等恶意行为。在 JSP 中,我们可以采用动态生成验证码的方式来实现验证码功能。

  1. 安装开发环境

你需要在本地搭建 JSP 的开发环境。这里我们以 Eclipse + Tomcat 作为例。

  1. 编写生成验证码的 Servlet

(1)新建一个 Java 类,并继承 HttpServlet。

@WebServlet("/captcha")
public class CaptchaServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int width = 100;
        int height = 50;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.setColor(Color.GRAY);
        g.fillRect(0, 0, width, height);
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, width - 1, height - 1);
        String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(str.length());
            char c = str.charAt(index);
            g.drawString(c + "", i * (width / 4) + 10, height / 2 + 5);
        }
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ImageIO.write(image, "PNG", bos);
        byte[] bytes = bos.toByteArray();
        response.setContentType("image/png");
        ServletOutputStream out = response.getOutputStream();
        out.write(bytes);
        out.close();
    }
}

(2)在上述 Servlet 中,我们使用 Graphics2D API 绘制了一个 100 × 50 的背景为灰色的矩形,然后使用随机数生成器生成四位随机验证码并将其绘制到图片上,最后将生成的图片以 PNG 格式写入一个 ByteArrayOutputStream 中,通过一个 ServletOutputStream 输出到响应中。

  1. 编写 JSP 页面

(1)新建 captcha.jsp 文件。在该文件中编写以下代码:

<html>
<head>
    <title>JavaWeb 实验室 - 验证码</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head>
<body>
<div>
    <p>请输入下方验证码:</p>
    <form method="post" action="result.jsp">
        <p><label>验证码:</label><input type="text" name="captcha" size="20"/></p>
        <p><img src="captcha" alt="captcha"/></p>
        <p><input type="submit" value="提交"/></p>
    </form>
</div>
</body>
</html>

在该页面中,我们使用了一个表单,该表单提交到 result.jsp 页面。同时,我们在表单中嵌入了一个图片,用于展示由 captcha Servlet 动态生成的验证码。

(2)新建 result.jsp 文件,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<%!
    private static String captcha = "ABCD";  // 此处预设验证码为 "ABCD",实际应用中应该从 session 中获取
%>
<html>
<head>
    <title>JavaWeb 实验室 - 结果</title>
    <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
</head>
<body>
<%
    String inputCaptcha = request.getParameter("captcha");
    if (inputCaptcha == null || !inputCaptcha.equalsIgnoreCase(captcha)) {
        out.println("<p>验证码错误,请重新输入!</p>");
    } else {
        out.println("<p>验证码输入成功!</p>");
    }
%>
<p><a href="captcha.jsp">重新输入</a></p>
</body>
</html>

在该页面中,我们首先通过 request.getParameter("captcha") 获取用户提交的验证码。然后,我们判断用户输入的验证码是否与事先设定的验证码相等。如果相等,我们输出“验证码输入成功!”的提示信息;反之,我们输出“验证码错误,请重新输入!”的提示信息。

  1. 测试

(1)启动 Tomcat 服务器。

(2)访问 http://localhost:8080/your-project-name/captcha.jsp,即可看到一个嵌入了动态生成的验证码图片的表单。

(3)在表单中输入“ABCD”(不区分大小写)并提交,即可看到“验证码输入成功!”的提示信息;反之,会提示“验证码错误,请重新输入!”。

示例2:
生成数字验证码

@WebServlet("/captcha")
public class CaptchaServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int width = 100;
        int height = 50;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        g.setColor(Color.GRAY);
        g.fillRect(0, 0, width, height);
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, width - 1, height - 1);
        int x, y;
        for (int i = 0; i < 10; i++) {
            x = new Random().nextInt(width);
            y = new Random().nextInt(height);
            g.setColor(Color.GREEN);
            g.drawOval(x, y, 1, 1);
        }
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 4; i++) {
            int num = random.nextInt(10);
            sb.append(num);
            g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
            g.drawString(num + "", width/4*i+5, 25);
        }

        request.getSession().setAttribute("captcha", sb.toString());

        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ImageIO.write(image, "PNG", bos);
        byte[] bytes = bos.toByteArray();
        response.setContentType("image/png");
        ServletOutputStream out = response.getOutputStream();
        out.write(bytes);
        out.close();
    }
}

上述代码所实现的是一个动态生成的数字验证码。它与第一个示例的不同之处在于,它会在图片的任意位置生成 10 个随机分布的圆点,并且验证码的内容也是由 4 个随机数字组成。在生成验证码的同时,我们将成功生成的验证码存入 session 中,以方便后面的校验。

总结

通过以上两个例子,我们了解了在 JSP 中动态生成验证码的基本步骤和操作,包括 Java 代码和 JSP 页面的编写、相关的 Servlet 控制及 session 的数据传递,以及验证码图片的生成和输出等。实际应用中,我们可以根据需要对验证码的生成及验证方式进行改进或优化,来满足不同应用场景的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP验证码动态生成方法 - Python技术站

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

相关文章

  • Servlet的5种方式实现表单提交(注册小功能),后台获取表单数据实例

    这里是Servlet实现表单提交的5种方式及获取表单数据的攻略: 一、POST提交表单 POST 是较为安全的一种方法,用于向 Web 页面发送大量数据。数据是作为 HTTP POST 请求的一部分来发送的。下面是示例代码。 // 在 doPost 方法中获取表单数据 protected void doPost(HttpServletRequest requ…

    Java 2023年5月20日
    00
  • Java毕业设计实战之二手书商城系统的实现

    Java毕业设计实战之二手书商城系统的实现 二手书商城系统是一个基于Java的Web应用程序,它允许用户在网上购买和销售二手书籍。在本文中,我们将详细讲解二手书商城系统的实现过程,并提供两个示例来说明这个过程。 系统需求 二手书商城系统需要满足以下需求: 用户可以注册和登录。 用户可以浏览和搜索二手书籍。 用户可以购买和销售二手书籍。 管理员可以管理用户和书…

    Java 2023年5月18日
    00
  • Spring Boot定时器创建及使用解析

    Spring Boot定时器创建及使用解析 1. 概述 Spring Boot提供了丰富的定时任务的支持,其中最常用的是基于注解的定时任务。通过在方法上添加@Scheduled注解,即可实现对应的定时任务调度。 2. 添加依赖 在使用Spring Boot的定时任务功能前,我们需要先在pom.xml文件中添加对应的依赖: <dependency>…

    Java 2023年5月19日
    00
  • Mybatis实现分表插件

    分库分表是常见的数据库水平扩展方案之一,Mybatis实现分表插件,可以对数据库进行动态分表,方便进行扩展和管理。下面我将为您详细介绍如何实现Mybatis分表插件,并提供两条示例。 什么是Mybatis分表插件? Mybatis分表插件是一种Mybatis的插件机制,可以应对分表的需求。通常情况下,将业务数据切分到多个表中,可以极大地提高多线程并发执行时的…

    Java 2023年5月20日
    00
  • 超细讲解Java调用python文件的几种方式

    恭喜您,这是一个非常有用的话题。在本篇文章中,我们将会深入探讨Java调用Python文件操作的几种方式。下面是完整攻略的具体内容。 1.首选Java调用Python文件的方式:Jython Jython(Java Python)是一种Python解释器,它使用Java语言编写,可以让Python代码在Java环境下运行。Jython具有明显的优势,可以很好…

    Java 2023年5月19日
    00
  • 详解快速排序算法中的区间划分法及Java实现示例

    区间划分法是快速排序算法中一个非常重要的步骤。下面我将详细讲解区间划分法的实现过程,并给出Java实现示例。 区间划分法 简介 区间划分法是快速排序算法的一个核心步骤,其目的是将一个数组以某个值为分界点,将其分为两个部分,其中一个部分所有元素均小于等于该值,另一个部分所有元素均大于等于该值。完成区间划分后,可通过递归地对两个部分分别进行排序,最终完成整个数组…

    Java 2023年5月19日
    00
  • Java中难理解的四个概念

    下面是讲解Java中难理解的四个概念的攻略。 1. 非静态内部类和静态内部类 对于Java中的内部类,可以分为两种类型:非静态内部类和静态内部类。 非静态内部类的创建需要依赖于外部类的实例,而静态内部类则不需要。简单来说,非静态内部类可以访问外部类的非静态成员和方法,而且可以直接访问外部类的实例变量。静态内部类则不能直接访问外部类的实例变量和非静态成员,但可…

    Java 2023年5月26日
    00
  • Java实战之实现在线小说阅读系统

    Java实战之实现在线小说阅读系统攻略 项目简介 本项目是一个在线小说阅读系统,可以实现用户注册登录、搜索小说、在线阅读等功能。该项目使用 Java 语言作为主要开发语言,并使用 Maven 进行项目构建和管理,使用 Spring Boot 框架搭建后端服务,使用 Thymeleaf 模板引擎进行页面渲染,使用 Bootstrap 框架进行前端页面布局。 开…

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