Java Web开发之图形验证码的生成与使用方法

Java Web开发之图形验证码的生成与使用方法

在Java Web开发中,图形验证码是常用的用户验证工具。通过在表单中添加验证码,可以有效防止自动化机器人等非人类恶意行为的攻击。本文将详细介绍Java Web开发中,如何生成和使用图形验证码。

生成图形验证码

生成图形验证码需要使用Java提供的Graphics2D类。其中,需要注意以下几个关键点:

  1. 随机生成指定位数的验证码字符串
  2. 定义图形验证码图片的宽度和高度
  3. 绘制并设置图形的字体和颜色
  4. 绘制验证码字符串,并添加干扰线
  5. 输出图片格式并输出到客户端

下面是一个生成图形验证码图片的示例代码:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;

public class CaptchaGenerator {

    private static final int WIDTH = 100;
    private static final int HEIGHT = 40;
    private static final int LENGTH = 4;

    private static String generateCaptchaString() {
        String source = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < LENGTH; ++i) {
            int index = random.nextInt(source.length());
            sb.append(source.charAt(index));
        }
        return sb.toString();
    }

    public static BufferedImage generateCaptchaImage() throws IOException {
        BufferedImage captchaImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = captchaImage.createGraphics();

        graphics.setColor(Color.LIGHT_GRAY);
        graphics.fillRect(0, 0, WIDTH, HEIGHT);

        Font font = new Font("Arial", Font.BOLD, 20);
        graphics.setFont(font);

        String captchaString = generateCaptchaString();
        for (int i = 0; i < LENGTH; ++i) {
            int x = 10 + i * 20;
            int y = 25;
            int theta = (int) (Math.random() * 45);
            graphics.rotate(theta * Math.PI / 180, x, y);
            graphics.setColor(getRandomColor());
            graphics.drawString(String.valueOf(captchaString.charAt(i)), x, y);
            graphics.rotate(-theta * Math.PI / 180, x, y);
        }

        Random random = new Random();
        for (int i = 0; i < 4; ++i) {
            int x1 = random.nextInt(WIDTH);
            int y1 = random.nextInt(HEIGHT);
            int x2 = random.nextInt(WIDTH);
            int y2 = random.nextInt(HEIGHT);
            graphics.setColor(getRandomColor());
            graphics.drawLine(x1, y1, x2, y2);
        }

        ImageIO.write(captchaImage, "JPEG", response.getOutputStream());
        graphics.dispose();

        return captchaImage;
    }

    private static Color getRandomColor() {
        Random random = new Random();
        int r = random.nextInt(256);
        int g = random.nextInt(256);
        int b = random.nextInt(256);
        return new Color(r, g, b);
    }
}

在网页中使用图形验证码

在网页中使用图形验证码,需要在表单中添加一个验证码输入框,同时定义一个表示图形验证码的图片。点击验证码图片之后,可以通过AJAX请求向后台获取最新的验证码图片,从而避免使用缓存的旧图片。

以下是一个使用Java Servlet实现图形验证码功能的示例代码:

@WebServlet("/captcha")
public class CaptchaServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("image/jpeg");
        response.setHeader("Cache-Control", "no-store");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", 0);
        BufferedImage captchaImage = CaptchaGenerator.generateCaptchaImage(response);
        HttpSession session = request.getSession(true);
        session.setAttribute("captcha", captchaString);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String userCaptcha = request.getParameter("captcha");
        HttpSession session = request.getSession();
        String captcha = (String) session.getAttribute("captcha");
        if (captcha != null && captcha.equalsIgnoreCase(userCaptcha)) {
            // 验证码正确
        } else {
            // 验证码错误
        }
    }
}

在表单中添加验证码输入框和图形验证码图片:

<form action="login" method="post">
  <div>
    <label for="username">用户名:</label>
    <input type="text" id="username" name="username">
  </div>
  <div>
    <label for="password">密码:</label>
    <input type="password" id="password" name="password">
  </div>
  <div>
    <label for="captcha">验证码:</label>
    <input type="text" id="captcha" name="captcha">
    <img id="captchaImage" src="captcha" alt="验证码">
    <a href="#" onclick="javascript:document.getElementById('captchaImage').src='captcha?' + Math.random();">看不清?换一个</a>
  </div>
  <div>
    <input type="submit" value="登录">
  </div>
</form>

在上述表单中,当用户点击验证码图片时,会通过JavaScript生成一个新的URL,从而向服务器请求最新的验证码图片。

以上即为Java Web开发中图形验证码的生成和使用方法的完整攻略,并附带两个示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Web开发之图形验证码的生成与使用方法 - Python技术站

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

相关文章

  • 常见的Java缓存框架有哪些?

    常见的Java缓存框架有很多,其中比较流行的包括:Ehcache、Guava Cache、Redis、Caffeine等。 Ehcache Ehcache是一个开源的Java缓存框架,使用简单并且支持多种缓存策略,例如内存缓存和持久化缓存等。首先,我们需要在项目中添加Ehcache的依赖,然后使用如下代码来创建和获取缓存实例: CacheManager ca…

    Java 2023年5月11日
    00
  • JSP中的倒数计时和自动跳转页面

    关于JSP中的倒数计时和自动跳转页面,我来为您详细讲解一下。 倒数计时 在JSP页面中实现倒数计时,可以使用JavaScript来完成。具体步骤如下: 步骤一:在JSP页面上引入JavaScript代码 <script type="text/javascript"> </script> 步骤二:通过JavaScri…

    Java 2023年6月15日
    00
  • Struts中使用validate()输入校验方法详解

    关于“Struts中使用validate()输入校验方法详解”的完整攻略,下面是具体的内容: 1. 什么是validate()方法? 在Struts2中,validate()方法是对于输入进行校验的一种很重要的方式。在这个方法中,我们可以定义输入校验的方法,对于输入数据进行检查,如果不符合要求则返回一个错误信息,如果符合要求则不做处理。 2. validat…

    Java 2023年6月2日
    00
  • 线程局部变量的作用是什么?

    以下是关于线程局部变量的作用的完整使用攻略: 线程局部变量的作用 线程局部变量是指在多线程编程中,每个线程都拥有自己的变量本,互不干扰的一种变量。线程局部变量可以用来存储线程的状态信息,从而实现线程之间的数据隔离和共享。 线程局部变量的作用主要有以下几个方面: 1. 实现线程之间的数据隔离 在多线程编程中,线程之间的数据隔离是非常重要的。线程局部变量用来存储…

    Java 2023年5月12日
    00
  • Java如何分析算法的时间和空间复杂度

    要分析算法的时间和空间复杂度,我们需要了解算法的执行效率以及所占用的内存空间。Java提供一些实用的工具来帮助我们进行分析。具体步骤如下。 1. 编写算法代码 首先,我们需要编写一个算法的代码示例。这个算法可以是排序、查找、遍历等等。为了方便演示,我们这里以一个简单的冒泡排序算法为例: public static void bubbleSort(int[] …

    Java 2023年5月19日
    00
  • SpringMvc直接接收json数据自动转化为Map的实例

    讲解SpringMvc直接接收json数据自动转化为Map的实例的完整攻略如下: 1. 添加相关依赖 首先,我们需要添加SpringMvc相关的依赖。在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework</groupId> <artifactId&g…

    Java 2023年5月26日
    00
  • Spring + mybatis + mysql使用事物的几种方法总结

    Spring + Mybatis + MySQL 使用事物的几种方法总结 在 Spring + Mybatis + MySQL 项目中,我们经常需要使用事务来保证多个操作的一致性,或者保证某些操作的原子性。本文将总结一些使用事务的常用方法。 1. 声明式事务 1.1 基于注解的事务管理 1.1.1 配置数据源 首先需要在 Spring 的配置文件中配置数据源…

    Java 2023年5月20日
    00
  • Spring Data JPA实现动态查询的两种方法

    下面我将详细讲解“Spring Data JPA实现动态查询的两种方法”的完整攻略。 一、介绍 Spring Data JPA是Spring家族中非常流行的项目之一,它使我们能够更方便地使用JPA进行持久层开发。除了基本的CRUD外,Spring Data JPA还提供了许多方便的查询方法。但是,有时候我们需要根据请求参数来动态构建查询条件,这就需要使用Sp…

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