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日

相关文章

  • Mybatis分页插件PageHelper配置及使用方法详解

    下面我就为您详细讲解”Mybatis分页插件PageHelper配置及使用方法详解”。 一、PageHelper简介 PageHelper是一款Mybatis分页插件,它提供了分页的基本功能,包括支持MySQL、Oracle、SQLServer等数据库,支持多种分页查询方式,同时也提供了更好的Spring集成方式。 二、PageHelper使用方法 1.导入…

    Java 2023年5月20日
    00
  • java实现压缩字符串和java字符串过滤

    Java实现压缩字符串: 在Java中,可以使用GZip或Zip压缩算法来实现字符串压缩。下面是一个使用GZip算法压缩字符串的示例代码: import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import …

    Java 2023年5月26日
    00
  • js控制的遮罩层实例介绍

    我来详细讲解一下“js控制的遮罩层实例介绍”的完整攻略。 什么是遮罩层? 遮罩层(Mask)是指用于覆盖在整个页面或页面上的某个区域上的一种层,其作用是遮盖页面或某个区域,通常用于实现模态框的效果。 实现遮罩层的方式 实现遮罩层主要有以下两种方式: 使用CSS实现 使用JavaScript实现 在这里,我们主要讲解使用JavaScript实现遮罩层的方式。 …

    Java 2023年6月15日
    00
  • java实现动态代理示例分享

    下面是“java实现动态代理示例分享”的完整攻略: 什么是动态代理? 在Java中,代理是一种常见的设计模式。代理模式的主要作用是提供间接访问,控制对对象的访问。代理模式使得代理对象可以在不改变原始对象的情况下,对对象的访问进行扩展。动态代理是一种特殊类型的代理模式,它是在程序运行时动态地创建代理对象,而不是在编译时就定义。 在Java中,动态代理是通过代理…

    Java 2023年5月30日
    00
  • java中的GC收集器详情

    下面是“Java中的GC收集器详情”的完整攻略: 背景 在使用Java编写应用程序时,内存管理是一个非常重要的问题。如果不合理地管理好内存,可能会导致诸如内存泄漏、内存溢出等问题。Java为程序员提供了一种方便的内存管理方案——垃圾收集器(GC)。在绝大部分情况下,我们不需要手动去释放内存,GC会自动帮助我们管理内存。Java中的垃圾收集器有很多种,各种收集…

    Java 2023年5月20日
    00
  • Spring MVC项目开发踩过的一些bug

    下面是详细的攻略: Spring MVC项目开发踩过的一些bug 1. 关于jsp页面中的EL表达式 在jsp页面中使用EL表达式时,在表达式中不要包含两对#{和},如果要包含两对,则需要使用反斜线进行转义。例如:在表单中使用<input type=”text” name=”username” value=”${user.name}”>,表示把u…

    Java 2023年6月15日
    00
  • 5种解决Java独占写文件的方法

    5种解决Java独占写文件的方法 在使用Java进行文件操作时,有时会遇到独占写文件的问题,即在一个程序正在写一个文件时,其他程序无法访问该文件。这种情况下,我们需要采用一些特殊的方法来解决这个问题。下面介绍五种解决Java独占写文件问题的方法。 方法一:使用RandomAccessFile类 RandomAccessFile 可以访问文件的任意位置读写数据…

    Java 2023年5月20日
    00
  • java实现sunday算法示例分享

    下面是“java实现sunday算法示例分享”的完整攻略: 算法背景 Sunday算法是一种字符串匹配算法,在字符串匹配过程中可以快速地跳过一些无需匹配的字符,提高字符串匹配的效率。它的基本思想是在匹配的过程中尽可能地跳过一些字符,最大化地减少匹配次数。 算法实现 下面是Sunday算法的Java实现,包括主函数和辅助函数。 public class Sun…

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