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日

相关文章

  • SpringBoot中通过实现WebMvcConfigurer参数校验的方法示例

    下面是关于“SpringBoot中通过实现WebMvcConfigurer参数校验的方法示例”的完整攻略,包含两个示例说明。 SpringBoot中通过实现WebMvcConfigurer参数校验的方法示例 在SpringBoot中,我们可以通过实现WebMvcConfigurer接口来实现参数校验的功能。WebMvcConfigurer是SpringMVC…

    Java 2023年5月17日
    00
  • extjs_02_grid显示本地数据、显示跨域数据

    现在我来详细讲解“extjs_02_grid显示本地数据、显示跨域数据”的完整攻略。 1. Grid 显示本地数据 1.1 示例说明 下面是一个简单的示例,演示如何创建 Ext JS Grid 并显示本地数据。 Ext.application({ name: ‘MyApp’, launch: function() { // 创建数据模型 Ext.define…

    Java 2023年6月16日
    00
  • Java异常Exception详细讲解

    Java异常Exception详细讲解 什么是Java异常Exception? 在Java中,异常(Exception)是指程序在运行时遇到的错误或意外情况。当Java程序出现异常时,会抛出一个异常对象,可以通过捕获和处理这个异常来防止程序崩溃。Java中的异常分为三种类型:Checked Exception(受检异常)、Runtime Exception(…

    Java 2023年5月27日
    00
  • 微信小程序实现触底加载

    下面是详细讲解“微信小程序实现触底加载”的完整攻略: 一、背景 随着微信小程序的普及,越来越多的开发者开始尝试开发小程序。而在小程序中,常常需要实现触底加载的功能,即当用户滚动到页面底部时,自动加载更多数据。这一功能对于提升用户体验、提高应用性能,非常重要。 二、实现思路 实现触底加载的基本思路如下: 在页面的wxml文件中,使用scroll-view组件,…

    Java 2023年5月23日
    00
  • Spring Boot(四)之使用JWT和Spring Security保护REST API

    下面是关于Spring Boot如何使用JWT和Spring Security保护REST API的攻略: 什么是JWT? JSON Web Token(JWT)是一种开放标准(RFC 7519),用于通过网络在各方之间安全地传输声明。JSON Web Token是由三部分组成:标题,声明和签名。例如: eyJhbGciOiJIUzI1NiIsInR5cCI…

    Java 2023年5月20日
    00
  • SpringBoot HikariCP连接池详解

    SpringBoot HikariCP连接池详解 本文介绍如何使用SpringBoot和HikariCP来管理MySQL数据库连接池。 什么是HikariCP? HikariCP是一个高效的、快速的、轻量级的JDBC连接池,取名自日本的“光之屋”。与其他连接池相比,它有更快的启动时间、更小的内存占用以及更高的性能。 SpringBoot集成HikariCP …

    Java 2023年5月20日
    00
  • Java synchronized底层的实现原理

    Java中的synchronized关键字是一种用来控制多线程同时访问共享资源的机制,通过synchronized关键字的应用可以保证同一时刻只有一个线程执行某个方法或代码块。 synchronized的锁定对象可以是普通对象,但需要注意的是,synchronized作用在对象上时,不同的对象之间互不影响,一个对象的锁与另一个对象的锁是互相独立的。下面来详细…

    Java 2023年5月26日
    00
  • 浅谈Java8 判空新写法

    下面是详细讲解“浅谈Java8 判空新写法”的完整攻略。 简介 在Java编程中,需要频繁对对象、数组等进行非空判断,以避免出现空指针异常的情况。传统的判空写法往往较繁琐,不够简洁明了。在Java8中,引入了Optional类,可以使用一种新的判空写法,使代码更加简洁易懂。 Optional类介绍 Optional类是Java8中新增的类,用于解决NullP…

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