search
HomeJavajavaTutorialHow to implement verification code with SpringBoot+kaptcha

1. Basic usage

kaptcha is a very old verification code generation tool. How old is it? Dating back to 2006.

After so many years, not only is it not lonely but it is still being used by many people, which shows its vitality and is worthy of our study.

For convenience, we will create a Spring Boot project to demonstrate its usage.

First create a new Spring Boot project, and then add kaptcha dependencies, as follows:

<dependency>
  <groupId>com.github.penggle</groupId>
  <artifactId>kaptcha</artifactId>
  <version>2.3.2</version>
</dependency>

Next we only need to provide a Bean to configure Kaptcha, as follows:

@Configuration
public class KaptchaConfig {
    @Bean(name = "captchaProducer")
    public DefaultKaptcha getKaptchaBean() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // 是否有边框 默认为true 我们可以自己设置yes,no
        properties.setProperty(KAPTCHA_BORDER, "yes");
        // 验证码文本字符颜色 默认为Color.BLACK
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
        // 验证码图片宽度 默认为200
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
        // 验证码图片高度 默认为50
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
        // 验证码文本字符大小 默认为40
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
        // KAPTCHA_SESSION_KEY
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
        // 验证码文本字符长度 默认为5
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
        // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
        // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}
## Configure each attribute value of the verification code image in #DefaultKaptcha. The meaning of each attribute is commented in the code, so I won’t say more.

Next we return the verification code image in the interface, as follows:

@Autowired
DefaultKaptcha defaultKaptcha;
@GetMapping("/img")
public void getKaptcha(HttpServletResponse resp) throws IOException {
    String text = defaultKaptcha.createText();
    BufferedImage image = defaultKaptcha.createImage(text);
    ImageIO.write(image, "jpg", resp.getOutputStream());
}

Here I write the image to the front end in the form of IO stream, of course it can also be converted into a Base64 The string returned to the front end is also OK.

Wait, something seems to be missing!

We did not store the generated verification code text into the session, so it would not be possible to verify when logging in. Some friends may say, isn’t this simple? Isn’t it enough to just save it in the interface?

NONONO!

Look, when we configure the DefaultKaptcha bean, there is such a line of code

properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");, this line of code means that it will automatically The generated verification code text is stored in the session, and the KEY of the session is kaptchaCode. However, in actual testing, you will find that the above code does not store the text generated by the verification code into the session.

The reason is that the Kaptcha tool actually provides a Servlet that generates verification code images. If we directly use the verification code Servlet it provides, then the above configuration will take effect. In Spring Boot, if you want to To configure the Servlet provided by Kaptcha, the method is as follows:

@Bean
ServletRegistrationBean<HttpServlet> kaptchaServlet() {
    ServletRegistrationBean<HttpServlet> bean = new ServletRegistrationBean<>();
    bean.setServlet(new KaptchaServlet());
    bean.addUrlMappings("/img");
    Properties properties = new Properties();
    // 是否有边框 默认为true 我们可以自己设置yes,no
    properties.setProperty(KAPTCHA_BORDER, "yes");
    // 验证码文本字符颜色 默认为Color.BLACK
    properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
    // 验证码图片宽度 默认为200
    properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
    // 验证码图片高度 默认为50
    properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
    // 验证码文本字符大小 默认为40
    properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
    // KAPTCHA_SESSION_KEY
    properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
    // 验证码文本字符长度 默认为5
    properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
    // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
    properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
    // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
    properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
    Map<String, String> map = new HashMap<String,String>((Map)properties);
    bean.setInitParameters(map);
    return bean;
}

After the project is started, directly access

/img to see the verification code image, and the text of the verification code will also be automatically saved. Enter the session. When the user logs in, the text content of the verification code can be obtained through session.getAttribute("kaptchaCode").

However, many times, the content returned by the verification code interface is relatively rich, which may not only be pictures, but also other information. Therefore, directly configuring a Servlet cannot meet our requirements. We can only write the verification code interface ourselves. If we write it ourselves, we have to save the verification code image into the session ourselves, then

properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, " kaptchaCode"); The configuration is actually useless and you don’t need to add it.

2. Customize the verification code text

Of course, we can also customize the verification code text. We only need to provide an implementation class of the verification code text, as follows:

public class KaptchaTextCreator extends DefaultTextCreator {
    private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(",");

    @Override
    public String getText() {
        Integer result = 0;
        Random random = new Random();
        int x = random.nextInt(10);
        int y = random.nextInt(10);
        StringBuilder suChinese = new StringBuilder();
        int randomoperands = (int) Math.round(Math.random() * 2);
        if (randomoperands == 0) {
            result = x * y;
            suChinese.append(CNUMBERS[x]);
            suChinese.append("*");
            suChinese.append(CNUMBERS[y]);
        } else if (randomoperands == 1) {
            if (!(x == 0) && y % x == 0) {
                result = y / x;
                suChinese.append(CNUMBERS[y]);
                suChinese.append("/");
                suChinese.append(CNUMBERS[x]);
            } else {
                result = x + y;
                suChinese.append(CNUMBERS[x]);
                suChinese.append("+");
                suChinese.append(CNUMBERS[y]);
            }
        } else if (randomoperands == 2) {
            if (x >= y) {
                result = x - y;
                suChinese.append(CNUMBERS[x]);
                suChinese.append("-");
                suChinese.append(CNUMBERS[y]);
            } else {
                result = y - x;
                suChinese.append(CNUMBERS[y]);
                suChinese.append("-");
                suChinese.append(CNUMBERS[x]);
            }
        } else {
            result = x + y;
            suChinese.append(CNUMBERS[x]);
            suChinese.append("+");
            suChinese.append(CNUMBERS[y]);
        }
        suChinese.append("=?@" + result);
        return suChinese.toString();
    }
}

This code is not difficult to understand. The generated verification code text is similar to a string like

1 1=?@2.

In the future, @ will be used as the dividing line, the string content in front of @ will be drawn on the picture, the content after @ will be stored in the session, and compared with the content uploaded by the user.

Of course, we also need to add the following attributes when configuring the verification code to modify the providing class of the verification code text:

properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "org.javaboy.tienchin.framework.config.KaptchaTextCreator");

After the configuration is completed, this verification code will be used directly in the interface in the future That's it. When using it, pay attention to splitting the generated verification code text and processing it. Part of it is used for drawing and part of it is used to save it in the session.

The above is the detailed content of How to implement verification code with SpringBoot+kaptcha. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:亿速云. If there is any infringement, please contact admin@php.cn delete
How to solve the problem that Flink cannot find Python task script when submitting PyFlink job to Yarn Application?How to solve the problem that Flink cannot find Python task script when submitting PyFlink job to Yarn Application?Apr 19, 2025 pm 05:21 PM

How to solve the problem that Flink cannot find Python task script when submitting PyFlink job to YarnApplication? When you are submitting PyFlink jobs to Yarn using Flink...

The output result of Java array is abnormal after expansion. What is the problem?The output result of Java array is abnormal after expansion. What is the problem?Apr 19, 2025 pm 05:18 PM

Java array expansion and strange output results This article will analyze a piece of Java code, which aims to achieve dynamic expansion of arrays, but during operation...

Docker Nginx deployment front-end project: How to resolve blank pages and proxy exceptions?Docker Nginx deployment front-end project: How to resolve blank pages and proxy exceptions?Apr 19, 2025 pm 05:15 PM

Blank pages and proxy exceptions encountered when deploying front-end projects with Docker Nginx. When using Docker and Nginx to deploy front-end and back-end projects, you often encounter some...

Spring Boot 3 Project: How to properly deploy external configuration files to Tomcat?Spring Boot 3 Project: How to properly deploy external configuration files to Tomcat?Apr 19, 2025 pm 05:12 PM

Deployment method of external configuration files of SpringBoot3 project In SpringBoot3 project development, we often need to configure the configuration file application.properties...

How to convert Apache's .htaccess configuration to Nginx's configuration?How to convert Apache's .htaccess configuration to Nginx's configuration?Apr 19, 2025 pm 05:09 PM

Configuration method for converting Apache's .htaccess configuration to Nginx In project development, you often encounter situations where you need to migrate your server from Apache to Nginx. Ap...

In small-scale JavaWeb applications, is it feasible for Dao layer to cache all personnel entity classes?In small-scale JavaWeb applications, is it feasible for Dao layer to cache all personnel entity classes?Apr 19, 2025 pm 05:06 PM

JavaWeb application performance optimization: An exploration of the feasibility of Dao-level entity-class caching In JavaWeb application development, performance optimization has always been the focus of developers. Either...

What is the reason for the double integral ∫∫ydσ=0 in polar coordinates?What is the reason for the double integral ∫∫ydσ=0 in polar coordinates?Apr 19, 2025 pm 05:03 PM

Solving double integrals under polar coordinate system This article will answer a question about double integrals under polar coordinates in detail. The question gives a point area and is incorporated...

How to ensure the uniqueness of outbound script tasks under high concurrency and monitor their operating status in real time?How to ensure the uniqueness of outbound script tasks under high concurrency and monitor their operating status in real time?Apr 19, 2025 pm 05:00 PM

How to ensure the uniqueness of script tasks and monitor their operating status in a high concurrency environment? This article will explore how to ensure an outbound foot in a cluster environment...

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SecLists

SecLists

SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use