springboot生成图片验证码(借鉴并分析)

目录

一、CaptchaUtil代码展示

java 复制代码
package com.minster.yanapi.utils;

import com.google.code.kaptcha.impl.DefaultKaptcha;

import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


import java.util.Properties;



@Configuration
public class CaptchaUtil{

    @Bean
    public DefaultKaptcha getDefaultKaptcha() {
       
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
       
        Properties properties = new Properties();
        
        properties.setProperty("kaptcha.border", "yes");
          
        properties.setProperty("kaptcha.border.color", "105,179,90");
        properties.setProperty("kaptcha.border.thickness","1");
    
        properties.setProperty("kaptcha.session.key", "code");
   
        properties.setProperty("kaptcha.textproducer.font.color", "blue");
  
        properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅 黑");
   
        properties.setProperty("kaptcha.textproducer.font.size", "30");
        properties.setProperty("kaptcha.textproducer.char.length", "4");
      
        properties.setProperty("kaptcha.textproducer.char.space", "4");
     
        properties.setProperty("kaptcha.image.width", "100");
    
        properties.setProperty("kaptcha.image.height", "40");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }


}

这段代码是一个基于Spring框架的验证码配置类,主要用于配置验证码生成器的属性和参数。

  1. @Configuration 注解标识这是一个配置类,用于定义 Spring Bean。

  2. CaptchaUtil 类定义了一个名为 getDefaultKaptcha 的方法,该方法使用 @Bean 注解,表示它会被Spring容器管理,并作为一个Bean提供。

  3. getDefaultKaptcha 方法中,创建了 DefaultKaptcha 类的实例,这是一个基于Google Kaptcha库的验证码生成器。

  4. 通过 Properties 对象配置验证码生成器的各种属性。以下是一些主要的配置项:

    • kaptcha.border: 是否有边框,这里设置为 "yes"。
    • kaptcha.border.color: 边框颜色,这里设置为 "105,179,90"。
    • kaptcha.session.key: 存储验证码的 session key,这里设置为 "code"。
    • kaptcha.textproducer.font.color: 验证码文本字符颜色,这里设置为 "blue"。
    • kaptcha.textproducer.font.names: 字体样式,这里设置为 "宋体,楷体,微软雅黑"。
    • kaptcha.textproducer.font.size: 字体大小,这里设置为 "30"。
    • kaptcha.textproducer.char.length: 验证码字符长度,这里设置为 "4"。
    • kaptcha.textproducer.char.space: 字符间距,这里设置为 "4"。
    • kaptcha.image.width: 验证码图片宽度,这里设置为 "100"。
    • kaptcha.image.height: 验证码图片高度,这里设置为 "40"。
  5. 创建一个 Config 对象,并将之前配置的 Properties 对象传递给它,用于构建验证码生成器的配置。

  6. 将配置好的 Config 对象设置到 DefaultKaptcha 实例中。

  7. 最后,返回配置好的 DefaultKaptcha 实例。

总体来说,这个配置类的作用是创建和配置一个用于生成验证码的 DefaultKaptcha Bean,并通过Spring容器进行管理。该验证码生成器的外观和行为由一系列属性值定义,这些属性值可以在配置中进行调整,以满足具体的需求。

二、CaptchaController 代码展示

java 复制代码
@RestController
@RequestMapping("/code")
public class CaptchaController {

    @Autowired
    private DefaultKaptcha defaultKaptcha;

    @GetMapping( "/captcha")
    public void captcha(HttpServletRequest request, HttpServletResponse response){
        //定义response输出类型为image/jpeg
        response.setDateHeader("Expires",0);
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        response.setHeader("Pragma", "no-cache");
        response.setContentType("image/jpeg");
        //---------------------------生成验证码----------------------
        //获取验证码文本内容
        String text = defaultKaptcha.createText();
        System.out.println("验证码:  " + text);
        //将验证码放到session中
        request.getSession().setAttribute("captcha",text);
        //根据文本内容创建图形验证码
        BufferedImage image = defaultKaptcha.createImage(text);
        ServletOutputStream outputStream = null;
        try {
            outputStream = response.getOutputStream();
            //输出流输出图片,格式为jpg
            ImageIO.write(image,"jpg",outputStream);
            outputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (outputStream != null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

上述代码是一个基于Spring框架的Java类,使用@RestController注解标识为一个RESTful风格的控制器,处理与验证码相关的HTTP请求。以下是对代码的详细分析:

  1. 类注解:

    • @RestController: 表示这是一个控制器类,并且所有方法都以JSON格式返回响应。
  2. 类声明:

    • @RequestMapping("/code"): 定义了类级别的请求映射,表示处理所有以"/code"开头的请求。
  3. 字段注入:

    • private DefaultKaptcha defaultKaptcha: 使用@Autowired注解进行依赖注入,注入了一个名为defaultKaptcha的DefaultKaptcha类型的Bean。
  4. 方法定义:

    • @GetMapping("/captcha"): 处理HTTP GET请求,映射路径为"/code/captcha"。
    • public void captcha(HttpServletRequest request, HttpServletResponse response): 处理验证码请求的方法,接受HttpServletRequest和HttpServletResponse作为参数。
  5. 验证码生成与输出:

    • 设置响应头,禁用缓存,确保验证码每次都是新的。
    • 获取验证码文本内容:String text = defaultKaptcha.createText();
    • 将验证码文本放入Session中:request.getSession().setAttribute("captcha", text);
    • 创建图形验证码:BufferedImage image = defaultKaptcha.createImage(text);
    • 获取输出流:ServletOutputStream outputStream = response.getOutputStream();
    • 将验证码图片以JPEG格式写入输出流:ImageIO.write(image, "jpg", outputStream);
    • 关闭输出流。
  6. 异常处理:

    • 在输出流操作中使用了try-catch块捕获IOException,并打印异常信息。
相关推荐
我没想到原来他们都是一堆坏人5 分钟前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
沙二原住民14 分钟前
提升数据库性能的秘密武器:深入解析慢查询、连接池与Druid监控
java·数据库·oracle
上官浩仁14 分钟前
springboot redisson 缓存入门与实战
spring boot·redis·缓存
mabo_9704@163.com15 分钟前
SpringAI调用MCP服务的实现思路
spring·ai
小小工匠15 分钟前
SpringBoot - Spring 资源加载全解析:ResourceLoader 与 ResourceUtils 的正确打开方式
spring boot·spring·resourceloader·resourcutils
Jerry&Grj38 分钟前
SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践
java·微服务·性能优化·springboot·架构设计·埋点技术
没有bug.的程序员44 分钟前
Redis Stream:轻量级消息队列深度解析
java·数据库·chrome·redis·消息队列
用户8160791833331 小时前
告别“魔法”:包你解决 Gradle 的下载慢问题
java
当归10242 小时前
SQL Server死锁排查实战指南
java·服务器·网络
echoyu.2 小时前
消息队列-初识kafka
java·分布式·后端·spring cloud·中间件·架构·kafka