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日

相关文章

  • java中ArrayList和LinkedList的区别详解

    Java 中 ArrayList 和 LinkedList 的区别详解 在 Java 中,ArrayList 和 LinkedList 均为常见的集合类,两者在实现以及使用场景上有一些区别。接下来将详细讲解这两种数据结构的区别。 ArrayList ArrayList 是 List 接口的实现类,底层是一个数组,因为是数组实现,所以支持快速随机访问,根据下标…

    Java 2023年5月26日
    00
  • 简单聊聊工作中常用的Java Lambda表达式

    让我详细讲解”简单聊聊工作中常用的Java Lambda表达式”的攻略。 Lambda 表达式是什么? Lambda 表达式是 Java 8 中引入的一项新特性,它可以在不需要具体实现某个接口中的所有方法的情况下,为该接口创建一个匿名实例。它可以看做是一种更简洁、更具表现力的极小函数,提供了 Java 中的函数式编程支持。 Lambda 表达式的语法 Lam…

    Java 2023年5月26日
    00
  • Springboot2.0配置JPA多数据源连接两个mysql数据库方式

    下面是关于Springboot2.0配置JPA多数据源连接两个mysql数据库的完整攻略: 1. 配置application.properties文件 在application.properties文件中配置两个数据源的连接信息,如下所示: #第一个数据源 spring.datasource.test1.jdbc-url=jdbc:mysql://local…

    Java 2023年5月20日
    00
  • Keytool工具的介绍与使用方法

    Keytool工具的介绍与使用方法 Keytool是Java密钥库工具,可用于管理Java密钥库及其内容。在Java中使用密钥库可以实现数字签名、加密/解密、SSL等功能。以下是Keytool工具的介绍与使用方法。 Keytool的主要功能 生成密钥对 管理证书 生成数字证书请求 查看密钥库中条目的详细信息 密钥库中的私钥和证书的关联操作 更改条目密码 更新…

    Java 2023年5月19日
    00
  • JS出现失效的情况总结

    JS出现失效的情况总结 JS是现代网站开发中必不可少的一部分,但在实际开发中,会遇到JS出现失效的情况,本文将对JS失效的各种可能情况进行总结,并给出具体解决方案。 1. JS文件未加载成功 当网页中引用的JS文件没有加载成功时,JS失效是最常见的情况之一。 解决方案 在HTML文件中检查script标签的引用路径是否正确,路径是否存在。 示例: <!…

    Java 2023年6月15日
    00
  • 解决spring项目找不到Aspect依赖注解的问题

    当我们在Spring项目中使用AspectJ时,可能会遇到找不到Aspect依赖注解的问题。这是由于AspectJ依赖的jar文件没有正确添加到项目的classpath中所致。以下是解决该问题的完整攻略: 第一步:添加AspectJ的依赖 在项目的pom.xml中添加以下依赖: <dependency> <groupId>org.as…

    Java 2023年5月31日
    00
  • Java字节码操纵库的作用是什么?

    Java字节码操纵库是指一些Java类库,它们在Java字节码层次上操作Java类的定义和结构。这种操纵方式不涉及源代码,适用于各种Java开发和工具套件。Java字节码操纵库不仅可以读取Java类文件的字节码,而且还可以根据需要修改类的数据和结构信息。Java字节码操纵库的主要用途是生成字节码、动态修改字节码以及分析字节码等。下面将介绍如何使用Java字节…

    Java 2023年5月11日
    00
  • 详解IDEA用maven创建springMVC项目和配置

    以下是关于“详解IDEA用Maven创建SpringMVC项目和配置”的完整攻略,其中包含两个示例。 详解IDEA用Maven创建SpringMVC项目和配置 在使用SpringMVC框架开发Web应用程序时,使用Maven构建项目是一个非常好的选择。本文将介绍如何使用Maven和IDEA创建SpringMVC项目,并配置相关依赖和插件。 创建Maven项目…

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