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,并打印异常信息。
相关推荐
Yan.love17 分钟前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶20 分钟前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥20 分钟前
java提高正则处理效率
java·开发语言
智慧老师1 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm1 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
V+zmm101341 小时前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob2 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
xmh-sxh-13142 小时前
常用的缓存技术都有哪些
java
迷糊的『迷』2 小时前
vue-axios+springboot实现文件流下载
vue.js·spring boot
AiFlutter2 小时前
Flutter-底部分享弹窗(showModalBottomSheet)
java·前端·flutter