Java制作验证码的完整实例代码

首先需要了解什么是验证码,验证码是一种防止机器自动化操作的机制,通常用于表单提交、用户登录等场景中。Java可以通过生成随机数、加密算法等方式来制作验证码。

制作验证码的完整实例代码和步骤如下。

步骤一:引入依赖

我们使用Java的Spring框架,所以需要引入相应的依赖库,包括Spring MVC和Apache Commons Codec等。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.10</version>
</dependency>

步骤二:创建验证码生成类

我们可以创建一个名为VerifyCodeUtils的Java类,用于生成验证码。

public class VerifyCodeUtils {

    // 数字验证码
    private static final String VERIFY_CODES = "0123456789";

    /**
     * 生成验证码
     * @param verifySize 验证码长度
     * @return 返回生成的验证码字符串
     */
    public static String generateVerifyCode(int verifySize) {
        StringBuilder verifyCode = new StringBuilder();
        int codesLength = VERIFY_CODES.length();
        Random random = new Random();
        for (int i = 0; i < verifySize; i++) {
            verifyCode.append(VERIFY_CODES.charAt(random.nextInt(codesLength)));
        }
        return verifyCode.toString();
    }
}

其中,generateVerifyCode方法用于生成指定长度的数字验证码,其步骤如下:

  1. 首先定义一个StringBuilder对象verifyCode用于存储验证码;
  2. 获取数字验证码的长度,并定义一个随机数生成器Random;
  3. 循环生成指定长度的验证码,获取集合中随机下标对应的数字加入到verifyCode中;
  4. 最终将verifyCode转换为字符串类型的验证码返回。

步骤三:在Controller中使用验证码

我们可以将生成的验证码添加到ModelAndView中,在jsp页面中展示。

下面示例中我们使用Spring MVC的@ModelAttribute注解来实现。

@GetMapping("/index")
public ModelAndView index(@ModelAttribute("verifyCode")String verifyCode) {
    ModelAndView modelAndView = new ModelAndView("index");
    String code = VerifyCodeUtils.generateVerifyCode(6);
    modelAndView.addObject("verifyCode", code);
    return modelAndView;
}

在代码中,我们首先使用generateVerifyCode方法生成一个长度为6的验证码。

然后使用addObject方法将验证码添加到ModelAndView中,以verifyCode为键。

最后返回ModelAndView对象,Spring会自动将ModelAndView中数据渲染到对应的jsp页面中。

在jsp页面中展示验证码的代码如下:

<label>验证码:</label>
<input type="text" name="verifyCode" />
<img src="/verifyCode"/>

其中,通过img标签的src访问到服务器生成的验证码图片。

示例1:验证码图片显示不出来

如果在jsp页面中无法显示验证码图片,可能是路径不正确,我们可以从Controller中实现验证码图片的生成。示例代码如下:

@GetMapping("/verifyCode") 
public void verifyCode(HttpServletRequest request, HttpServletResponse response) throws Exception {
    String code = VerifyCodeUtils.generateVerifyCode(6);
    BufferedImage image = VerifyCodeUtils.getImage(code, 140, 30);
    request.getSession().setAttribute("verifyCode", code);
    response.setContentType("image/png");
    ImageIO.write(image, "png", response.getOutputStream());
}

其中的getImage方法用于将字符串类型的验证码转换为图片。

public static BufferedImage getImage(String verifyCode, int width, int height) {
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = image.createGraphics();
    g.setColor(Color.WHITE);
    g.fillRect(0, 0, width, height);
    g.setFont(new Font("Arial", Font.BOLD, 20));

    for (int i = 0; i < verifyCode.length(); i++) {
        g.setColor(new Color(20 + (int)(Math.random() * 110), 20 + (int)(Math.random() * 110), 20 + (int)(Math.random() * 110)));
        g.drawString(String.valueOf(verifyCode.charAt(i)), 20 * i + 10, 25);
    }

    g.dispose();
    return image;
}

verifyCode方法中,我们首先使用generateVerifyCode方法生成验证码字符串code。

将生成的验证码字符串存入Session中,并使用getImage方法生成对应的图片,并写入到response的输出流中。

最后,在jsp页面中,将img标签的src指向/verifyCode即可。

示例2: 验证码比对

如果我们需要在表单提交时对验证码进行比对,可以从Session中获取验证码,并将表单提交的验证码和Session中存储的验证码进行比对。

@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(HttpServletRequest request, HttpServletResponse response,
        @RequestParam("verifyCode")String verifyCode) throws Exception {
    HttpSession session = request.getSession();
    String code = (String)session.getAttribute("verifyCode");
    if (StringUtils.isEmpty(verifyCode) || !verifyCode.equalsIgnoreCase(code)) {
        // 生成的异常信息可以自定义
        throw new Exception("验证码错误");
    }
    // TODO: 检查用户名和密码是否正确
    return "success";
}

其中,使用了Java的字符串工具类Apache Commons Lang3中的StringUtils类,其可使用Maven依赖中:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.5</version>
</dependency>

在验证码比对过程中,首先从Session中获取验证码code,然后将Session中存储的验证码和表单提交的验证码进行比对。

如果比对不通过,可以生成一个异常信息或者其他提示信息提示用户。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java制作验证码的完整实例代码 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • Java垃圾收集器的作用是什么?

    Java垃圾收集器的作用 Java是一种面向对象的编程语言,拥有自己的垃圾收集器,其主要作用是管理内存,并在运行时自动回收不再使用的对象和释放内存空间。Java垃圾收集器在运行时周期性地扫描堆内存,检查哪些对象不再被使用,并将这些对象从内存中删除,以释放空间,防止内存泄漏和内存溢出等问题。 Java垃圾收集器分类 Java垃圾收集器由不同的组件组成,可以根据…

    Java 2023年5月11日
    00
  • 图书管理系统java代码实现

    我们来详细讲解一下“图书管理系统Java代码实现”的完整攻略。 1. 确定项目需求并设计数据库 在开发一个图书管理系统前,我们需要先确定其需求。例如,一个简单的图书管理系统通常需要包含以下基本功能: 图书的添加,修改和删除操作 图书的查找和查询操作 图书的借阅和归还操作 一旦需求确定,我们就可以开始设计数据库表结构了。一个基本的图书管理系统需要包含图书表、读…

    Java 2023年5月19日
    00
  • java实现文件复制、剪切文件和删除示例

    下面是“Java实现文件复制、剪切文件和删除”示例的完整攻略。 1. 复制文件 要使用Java复制文件,需要使用Java的IO库。有两种方法可以实现文件复制:通过字节流或字符流。 1.1 字节流复制 使用字节流复制文件的方法非常简单。以下是代码示例: import java.io.*; public class FileCopy { public stati…

    Java 2023年5月20日
    00
  • Java中this,static,final,const用法详解

    Java中this、static、final和const用法详解 一、this关键字 1.1 this指代当前对象 在Java中,this关键字可以用来指代当前对象。它通常被用于以下情况: 在一个构造函数中,用来区分成员变量和方法参数。 在一个方法中,用来访问当前对象的成员变量或者其他方法。 下面是一个使用this关键字的简单例子: public class…

    Java 2023年5月26日
    00
  • springBoot 与neo4j的简单整合示例

    下面是一份“springBoot与neo4j的简单整合示例”的完整攻略。 简介 Spring Boot是一种微服务框架,可帮助开发人员快速创建和配置开发中的应用程序。它具有快速启动、自动配置、无多余代码等特点。而Neo4j是一个高性能的图数据库,具有多种用途,如社交网络的关系建模、推荐系统等。将Spring Boot与Neo4j整合在一起可以使我们的应用程序…

    Java 2023年5月20日
    00
  • MyBatis中association的基本使用方法

    当我们需要处理关联对象时,MyBatis提供了association这一标签来解决该问题。该标签可以将一个对象作为另一个对象的属性进行查询,用于处理一对一或多对一的关联关系。 以下是使用association标签的基本用法: 1. 定义映射文件 首先要在映射文件中定义好需要返回的关联对象的属性以及查询语句以及需要查询的参数信息。以查询订单详情及所属用户为例,…

    Java 2023年5月20日
    00
  • 一文详解Object类和抽象类

    一文详解Object类和抽象类 什么是Object类 在Java中,所有的类都是继承自Object类的。Object类是Java语言中的根类,它是所有类的父类,也就是Java中的类都会隐式继承自Object类。在Object类中,定义了几个常用的方法,如: public String toString(): 返回对象的字符串表示。 public boolea…

    Java 2023年5月26日
    00
  • Java实现Timer的定时调度函数schedule的四种用法

    一、背景介绍 Java中提供了一个Timer类,是一种比较简单的定时器实现,比如我们可以基于这个类实现类似于 Linux 中 Cron 一样定时执行某些任务的功能。其中,定时调度函数 schedule 是 Timer 类最常用的方法之一,他用于安排指定的任务在指定的时间点或者经过指定的延迟后执行一次。这个函数有 4 种用法,下面将详细讲解。 二、使用方法 s…

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