java web开发之servlet图形验证码功能的实现

[TOC]

介绍

图形验证码(Captcha)是一种用于区分用户是机器人还是人类的测试。它通常用于网站注册、评论等功能。Java Web开发中,我们可以使用Servlet来实现图形验证码的功能,下面就来介绍一下如何实现。

实现步骤

以下是Servlet实现图形验证码的完整步骤:

  1. 创建验证码图片
  2. 将验证码图片输出到页面
  3. 将验证码传入Session中
  4. 验证用户输入是否与Session中的验证码匹配

下面我们逐步来讲解。

创建验证码图片

先来看一下示例代码:

public class CaptchaServlet extends HttpServlet {
    private int width = 100;//验证码图片的宽度
    private int height = 40;//验证码图片的高度
    private int codeCount = 4;//验证码字符个数
    private int lineCount = 150;//干扰线个数

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = buffImg.createGraphics();
        Random random = new Random();

        // 设置背景色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);

        // 设置字体
        Font font = new Font("Fixedsys", Font.BOLD, 28);
        g.setFont(font);

        // 设置干扰线
        for (int i = 0; i < lineCount; i++) {
            int xs = random.nextInt(width);
            int ys = random.nextInt(height);
            int xe = xs + random.nextInt(width / 8);
            int ye = ys + random.nextInt(height / 8);
            g.setColor(getRandomColor());
            g.drawLine(xs, ys, xe, ye);
        }

        // 设置验证码
        String code = "";
        for (int i = 0; i < codeCount; i++) {
            String str = String.valueOf(random.nextInt(10));
            code += str;
            g.setColor(getRandomColor());
            g.drawString(str, 25 * i + 10, 30);
        }

        // 释放图形资源
        g.dispose();

        // 将验证码保存在session中
        HttpSession session = request.getSession();
        session.setAttribute("code", code);

        response.setContentType("image/jpeg");// 设置响应的类型格式为图片格式
        OutputStream os = response.getOutputStream();// 得到向客户端输出图片的流
        ImageIO.write(buffImg, "jpeg", os);// 输出图片流
        os.close();
    }

    private Color getRandomColor() {
        Random random = new Random();
        return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
    }
}

CaptchaServlet是我们创建的Servlet,其中doGet方法用于处理GET请求,它会创建一个BufferedImage对象,并在该对象上绘制验证码图片。在实现绘制验证码的代码中,我们首先设置了背景色为白色,并填充整个图片;然后设置字体为Fixedsys,字号为28;接着绘制干扰线[1],最后在图片上绘制随机生成的验证码,把它保存到session中。

将验证码图片输出到页面

在前面的示例中,我们已经将生成的验证码保存到了Session中。此时我们需要将验证码图片输出到页面,让用户能够看到它。

在HTML页面中,添加一个类似于下面的img标签:

<img src="CaptchaServlet" onclick="this.src='CaptchaServlet?'+new Date().getTime()">

当用户首次访问该页面时,CaptchaServlet会生成验证码图片并输出到页面上。当用户点击该图片时,this.src会发生变化,具体来说,它会在原来的URL后面加上一个时间戳,这样浏览器就会认为这是一个新的URL,重新请求该URL,CaptchaServlet就会生成新的验证码图片并输出到页面上。

将验证码传入Session中

在生成验证码图片的时候,我们已经将验证码保存到Session中了。在该Session中,我们可以使用getAttribute方法来获取保存的验证码。

验证用户输入是否与Session中的验证码匹配

当用户提交页面表单时,我们需要验证用户输入的验证码是否与Session中保存的验证码匹配。具体来说,我们可以使用类似于下面的代码进行比较:

String code = (String) session.getAttribute("code");
if (code.equals(userInputCode)) {
    // 验证码正确
} else {
    // 验证码错误
}

示例

下面是两个代码示例,分别实现了使用Servlet生成图形验证码和验证用户输入。

示例一:生成图形验证码

以下是实现生成图形验证码的代码示例:

<!-- captcha.html -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>验证码示例</title>
</head>
<body>
    <form>
        <label>验证码:</label>
        <img src="CaptchaServlet" onclick="this.src='CaptchaServlet?'+new Date().getTime()">
        <br>
        <label>验证码输入:</label>
        <input type="text" name="captcha">
        <br>
        <button type="submit">提交</button>
    </form>
</body>
</html>
// CaptchaServlet.java
@WebServlet("/CaptchaServlet")
public class CaptchaServlet extends HttpServlet {
    private int width = 100;//验证码图片的宽度
    private int height = 40;//验证码图片的高度
    private int codeCount = 4;//验证码字符个数
    private int lineCount = 150;//干扰线个数

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = buffImg.createGraphics();
        Random random = new Random();

        // 设置背景色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);

        // 设置字体
        Font font = new Font("Fixedsys", Font.BOLD, 28);
        g.setFont(font);

        // 设置干扰线
        for (int i = 0; i < lineCount; i++) {
            int xs = random.nextInt(width);
            int ys = random.nextInt(height);
            int xe = xs + random.nextInt(width / 8);
            int ye = ys + random.nextInt(height / 8);
            g.setColor(getRandomColor());
            g.drawLine(xs, ys, xe, ye);
        }

        // 设置验证码
        String code = "";
        for (int i = 0; i < codeCount; i++) {
            String str = String.valueOf(random.nextInt(10));
            code += str;
            g.setColor(getRandomColor());
            g.drawString(str, 25 * i + 10, 30);
        }

        // 释放图形资源
        g.dispose();

        // 将验证码保存在session中
        HttpSession session = request.getSession();
        session.setAttribute("code", code);

        response.setContentType("image/jpeg");// 设置响应的类型格式为图片格式
        OutputStream os = response.getOutputStream();// 得到向客户端输出图片的流
        ImageIO.write(buffImg, "jpeg", os);// 输出图片流
        os.close();
    }

    private Color getRandomColor() {
        Random random = new Random();
        return new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));
    }
}

在该示例中,当用户访问captcha.html时,该页面会自动请求CaptchaServlet,从而生成验证码图片并显示在该页面上。

示例二:验证用户输入

以下是实现验证用户输入的代码示例:

<!-- validate.html -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>验证码示例</title>
</head>
<body>
    <form action="ValidateServlet" method="post">
        <label>验证码:</label>
        <img src="CaptchaServlet" onclick="this.src='CaptchaServlet?'+new Date().getTime()">
        <br>
        <label>验证码输入:</label>
        <input type="text" name="captcha">
        <br>
        <button type="submit">提交</button>
    </form>
</body>
</html>
// ValidateServlet.java
@WebServlet("/ValidateServlet")
public class ValidateServlet extends HttpServlet{
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        HttpSession session = request.getSession();
        String serverCode = (String) session.getAttribute("code");
        String userInputCode = request.getParameter("captcha");

        if (serverCode.equals(userInputCode)) {
            out.println("验证码输入正确!");
        } else {
            out.println("验证码输入错误!请重新输入!");
        }

        out.flush();
        out.close();
    }
}

在该示例中,当用户提交表单时,请求会发送到ValidateServlet,该Servlet需要从Session中获取生成的验证码,然后将用户输入的验证码与Session中的验证码进行比较,最后返回比较结果。

结论

本文介绍了使用Java Servlet实现图形验证码功能的完整攻略。当用户在浏览器中看到需要输入验证码时,通常需要访问Servlet生成验证码图片,将图片展示在页面上,等待用户输入。当用户提交表单后,需要将用户输入的验证码从表单中提交到Servlet中,在Servlet中可以将表单数据与Session中保存的验证码进行比较以验证验证码是否输入正确。这样就可以达到防止机器人攻击的目的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java web开发之servlet图形验证码功能的实现 - Python技术站

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

相关文章

  • Spring 与 JDK 线程池的简单使用示例详解

    下面是Spring与JDK线程池的简单使用示例详解的攻略。 Spring与JDK线程池的简单使用示例详解 什么是线程池 线程池是一种多线程的解决方案,它的核心思想是在应用程序启动的时候,提前创建若干个线程并放入线程池中,并维护这些线程的生命周期,应用程序需要处理任务的时候,不需要再临时创建新的线程,而是从线程池中获取可用的线程。 JDK线程池的使用 Java…

    Java 2023年5月18日
    00
  • 简单了解mybatis拦截器实现原理及实例

    下面是“简单了解MyBatis拦截器实现原理及实例”的完整攻略。 什么是MyBatis拦截器 MyBatis提供了一种灵活的机制,允许插件来干扰和改变SQL的执行过程。这种机制基于MyBatis的拦截器接口,可以拦截MyBatis框架中的各种操作,如StatementHandler、ResultSetHandler、Executor、ParameterHan…

    Java 2023年5月19日
    00
  • Go Java 算法之字符串解码示例详解

    Go Java 算法之字符串解码示例详解 什么是字符串解码? 字符串解码指的是将一串被编码的字符串进行解码(还原)成原来的字符串。在实际编码过程中,我们需要对字符串进行编码,以便于传输或存储,但需要使用的时候则需要对编码过的字符串进行解码还原成原来的字符串。 Go Java 字符串解码示例 在 Go Java 中有多种解码回字符串的解决方案,比如 URL d…

    Java 2023年5月20日
    00
  • java中@requestMappling注解的使用

    Java中@RequestMapping注解的使用 在Java中,@RequestMapping注解是一个非常常用的注解,它用于将HTTP请求映射到控制器的处理方法上。在本文中,我们将详细讲解@RequestMapping注解的使用,并提供两个示例来说明如何使用这个注解。 基本用法 @RequestMapping注解可以用于类级别和方法级别。在类级别上使用@…

    Java 2023年5月18日
    00
  • Java 集合框架掌握 Map 和 Set 的使用(内含哈希表源码解读及面试常考题)

    Java 集合框架掌握 Map 和 Set 的使用(内含哈希表源码解读及面试常考题) 介绍 Java 集合框架是 Java 语言提供的一个用于管理数据的框架,包含了一系列的接口和实现类,方便对不同类型的数据进行操作。其中,Map 和 Set 是集合框架中比较重要的部分。 本文将介绍 Map 和 Set 的使用方法,同时解读哈希表的源码,以及总结常见的面试考点…

    Java 2023年5月26日
    00
  • Tomcat 6.0下如何配置环境变量基本步骤分享

    下面是Tomcat 6.0下如何配置环境变量的基本步骤: 步骤一:下载Tomcat 6.0 首先需要从Tomcat的官方网站(https://tomcat.apache.org/download-60.cgi)上下载Tomcat 6.0的安装包。下载完成后,解压至任意路径。 步骤二:设置CATALINA_HOME环境变量 在“计算机”或“我的电脑”上点击右键…

    Java 2023年5月19日
    00
  • Java 9 中的模块Module系统

    关于Java 9中的模块(Module)系统,这里为您整理了完整的攻略。请您仔细阅读以下文章。 什么是Module系统 Java 9中引入了一种新的概念——Module系统,来管理和组织代码。作为Java9中最重要的新特性之一,模块化系统的引入为我们开发、维护和交付大规模的Java应用程序提供了更多的选择和优化。 为什么引入Module系统 随着时间的推移,…

    Java 2023年5月24日
    00
  • java编写贪吃蛇小游戏

    Java编写贪吃蛇小游戏完整攻略 1. 准备工作 在开始编写贪吃蛇小游戏之前,我们需要先准备好以下的工作:1. 安装Java开发环境:JDK。2. 选择合适的Java IDE,例如:Eclipse、IntelliJ IDEA等。 2. 创建Java项目 新建一个Java项目,命名为”SnakeGame”,并创建一个名为”Game”的主类。 此时我们需要实现一…

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