您的当前位置:首页正文

SpringBoot——整合kaptcha生成图片验证码

2024-11-06 来源:个人技术集锦
1Kaptcha 简介

Kaptcha 是一个可高度配置的实用验证码生成工具,可自由配置的选项如:

验证码的字体
验证码字体的大小
验证码字体的字体颜色
验证码内容的范围(数字,字母,中文汉字!)
验证码图片的大小,边框,边框粗细,边框颜色
验证码的干扰线
验证码的样式(鱼眼样式、3D、普通模糊、…)

2 SpringBoot 整合 Kaptcha
2.1导入依赖[springboot2.6.4]
      
      <!--验证码生成-->
        <dependency>
            <groupId>com.github.penggle</groupId>
            <artifactId>kaptcha</artifactId>
            <version>2.3.2</version>
        </dependency>

2.2 Kaptcha配置类
/**
 * 生成验证码配置
 * //可以设置很多属性,具体看com.google.code.kaptcha.Constants
 * kaptcha.border  是否有边框  默认为true  我们可以自己设置yes,no
 * kaptcha.border.color   边框颜色   默认为Color.BLACK
 * kaptcha.border.thickness  边框粗细度  默认为1
 * kaptcha.producer.impl   验证码生成器  默认为DefaultKaptcha
 * kaptcha.textproducer.impl   验证码文本生成器  默认为DefaultTextCreator
 * kaptcha.textproducer.char.string   验证码文本字符内容范围  默认为abcde2345678gfynmnpwx
 * kaptcha.textproducer.char.length   验证码文本字符长度  默认为5
 * kaptcha.textproducer.font.names    验证码文本字体样式  默认为new Font("Arial", 1, fontSize), >     //new Font("Courier", 1, fontSize)
 * kaptcha.textproducer.font.size   验证码文本字符大小  默认为40
 * kaptcha.textproducer.font.color  验证码文本字符颜色  默认为Color.BLACK
 * kaptcha.textproducer.char.space  验证码文本字符间距  默认为2
 * kaptcha.noise.impl    验证码噪点生成对象  默认为DefaultNoise
 * kaptcha.noise.color   验证码噪点颜色   默认为Color.BLACK
 * kaptcha.obscurificator.impl   验证码样式引擎  默认为WaterRipple
 * kaptcha.word.impl   验证码文本字符渲染   默认为DefaultWordRenderer
 * kaptcha.background.impl   验证码背景生成器   默认为DefaultBackground
 * kaptcha.background.clear.from   验证码背景颜色渐进   默认为Color.LIGHT_GRAY
 * kaptcha.background.clear.to   验证码背景颜色渐进   默认为Color.WHITE
 * kaptcha.image.width   验证码图片宽度  默认为200
 * kaptcha.image.height  验证码图片高度  默认为50
 **/
@Controller
public class KaptchaConfig {

    @Bean
    public Producer kaptchaProducer() {
        DefaultKaptcha captchaProducer = new DefaultKaptcha();
        Properties properties = new Properties();
        //字体颜色
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
        //验证码宽 110px
        properties.setProperty(Constants.KAPTCHA_IMAGE_WIDTH, "110");
        //验证码高 40px
        properties.setProperty(Constants.KAPTCHA_IMAGE_HEIGHT, "40");
        //字体大小
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "30");
        //生成验证字符的长度
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
        //字体
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "宋体,楷体,微软雅黑");
        //验证码干扰项
        properties.setProperty(Constants.KAPTCHA_NOISE_IMPL,"com.google.code.kaptcha.impl.NoNoise");
        //验证字符选项 0-9及A-Z的组合 【可根据具体的情况,进行设置,汉字也同样可以作为验证符选项】
        properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_CHAR_STRING,"0123456789ABCDEFGHIGKLMNOPQRSTUVWSYZ");
        Config config = new Config(properties);
        captchaProducer.setConfig(config);
        return captchaProducer;
    }
}

生成图片验证码的关键接口为 com.google.code.kaptcha.Producer,其中关键的方法
String createText() //创建验证码字符串
BufferedImage createImage(String text);//根据所给的字符串生成验证码图像

2.3 生成验证码图像
package com.nowcoder.community.controller;

import com.google.code.kaptcha.Producer;
import com.nowcoder.community.entity.CommunityConstant;
import com.nowcoder.community.entity.User;
import com.nowcoder.community.service.LoginService;
import com.nowcoder.community.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Map;

@Controller
public class LoginController {

    @Autowired
    private Producer producer;

    /**
     * 获得生成的随机验证码
     * @param response
     * @param httpSession
     */
    @GetMapping("/login/getKapatchaImage")
    public void getKapatchaImage(HttpServletResponse response, HttpSession httpSession){
        //生成验证码
        String text = producer.createText();
        BufferedImage image = producer.createImage(text);

        //验证码字符串写入到session中.服务器将依托cookie 【key,value】value中存放的是当前生成的sessionid.
        //以后浏览器访问浏览器时,将会携带该cookie信息,使得多个浏览器请求中携带重要的信息【基于HTTP请求是无状态的,将验证字符串存入到session中,保存到服务中】
        httpSession.setAttribute("kapatchaStr", text);

        //图片响应给response
        //响应格式为.png的图片
        response.setContentType("image/png");
        try {
            ServletOutputStream outputStream = response.getOutputStream();
            //响应给浏览器的是验证码图片
            ImageIO.write(image,"png",outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
Top