广告位联系
返回顶部
分享到

SpringBoot整合Kaptcha实现图片验证码加减乘除功能

java 来源:互联网 作者:佚名 发布时间:2024-07-25 21:55:32 人浏览
摘要

SpringBoot整合Kaptcha实现图片验证码加减乘除 在开发Web应用时,验证码是一个常见的功能,它可以帮助我们防止机器人的恶意操作。今天我们将学习如何使用Kaptcha生成图片验证码,并自定义验证

SpringBoot整合Kaptcha实现图片验证码加减乘除

在开发Web应用时,验证码是一个常见的功能,它可以帮助我们防止机器人的恶意操作。今天我们将学习如何使用Kaptcha生成图片验证码,并自定义验证码内容为100以内的加减乘除运算。

1. 添加Kaptcha依赖

首先,确保你的项目中包含Kaptcha的依赖。对于Maven项目,可以在pom.xml中添加以下依赖:

1

2

3

4

5

6

<!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha -->

<dependency>

    <groupId>com.github.penggle</groupId>

    <artifactId>kaptcha</artifactId>

    <version>2.3.2</version>

</dependency>

2. 自定义文本生成器

我们需要创建一个自定义的文本生成器MathKaptchaTextCreator,它将生成包含加减乘除运算的验证码内容。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

package com.bangbang.tracesource.admin.conf;

import com.google.code.kaptcha.text.impl.DefaultTextCreator;

import java.util.Random;

public class MathKaptchaTextCreator extends DefaultTextCreator {

    @Override

    public String getText() {

        Random random = new Random();

        int x = random.nextInt(100);

        int y = random.nextInt(100);

        String[] operators = {"+", "-", "*", "/"};

        String operator = operators[random.nextInt(4)];

        String expression = x + operator + y;

        int result = 0;

        switch (operator) {

            case "+":

                result = x + y;

                break;

            case "-":

                result = x - y;

                break;

            case "*":

                result = x * y;

                break;

            case "/":

                result = y == 0 ? x : x / y;

                break;

        }

        return expression + "=?@" + result;

    }

}

在这个实现中,我们生成了一个随机的加减乘除运算表达式,并将其结果附加在表达式的末尾,以@分隔。例如:1+1=?@2。

3. 配置Kaptcha

接下来,创建一个配置类KaptchaConfig来配置Kaptcha的属性,并指定我们的自定义文本生成器。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

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

import com.google.code.kaptcha.util.Config;

import org.springframework.context.annotation.Bean;

import org.springframework.stereotype.Component;

import java.util.Properties;

@Component

public class KaptchaConfig {

    @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.textproducer.font.color", "black");

        properties.setProperty("kaptcha.image.width", "110");

        properties.setProperty("kaptcha.image.height", "40");

        properties.setProperty("kaptcha.textproducer.font.size", "35");

        properties.setProperty("kaptcha.session.key", "code");

        properties.setProperty("kaptcha.textproducer.impl", "com.shy.admin.conf.MathKaptchaTextCreator");

        properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");

        // 设置干扰线

        properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.FishEyeGimpy");

        Config config = new Config(properties);

        defaultKaptcha.setConfig(config);

        return defaultKaptcha;

    }

}

4. 获取验证码图片的方法

我们还需要一个控制器方法来生成和返回验证码图片。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import javax.imageio.ImageIO;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

public class KaptchaController {

    @Autowired

    private DefaultKaptcha defaultKaptcha;

    @RequestMapping(value = "/kaptcha", method = RequestMethod.GET)

    public void getKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)

            throws IOException {

        byte[] captchaChallengeAsJpeg;

        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();

        try {

            // 生产验证码字符串并保存到session中 eg: 3-2=?@1

            String createText = defaultKaptcha.createText();

            // capStr就是算术题 也就是用户看到的验证码

            String capStr = createText.substring(0, createText.lastIndexOf("@"));

            // code 就是算术的结果 也就是输入的验证码

            String code = createText.substring(createText.lastIndexOf("@") + 1);

            httpServletRequest.getSession().setAttribute("KAPTCHA_SESSION_KEY", code);

            // 使用生产的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中

            BufferedImage challenge = defaultKaptcha.createImage(capStr);

            ImageIO.write(challenge, "jpg", jpegOutputStream);

        } catch (IllegalArgumentException e) {

            httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);

            return;

        }

        captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

        httpServletResponse.setHeader("Cache-Control", "no-store");

        httpServletResponse.setHeader("Pragma", "no-cache");

        httpServletResponse.setDateHeader("Expires", 0);

        httpServletResponse.setContentType("image/jpeg");

        httpServletResponse.getOutputStream().write(captchaChallengeAsJpeg);

        httpServletResponse.getOutputStream().flush();

    }

}

4.1. 详细讲解控制器中的切割操作

在控制器方法中,我们生成了验证码文本并将其保存在session中。生成的验证码文本格式为:1+1=?@2。接下来,我们需要将表达式和结果分离开来,以便将结果保存在session中用于验证用户输入。

1

2

3

4

5

6

7

// 生产验证码字符串并保存到session中 eg: 3-2=?@1

String createText = defaultKaptcha.createText();

// capStr就是算术题 也就是用户看到的验证码

String capStr = createText.substring(0, createText.lastIndexOf("@"));

// code 就是算术的结果 也就是输入的验证码

String code = createText.substring(createText.lastIndexOf("@") + 1);

httpServletRequest.getSession().setAttribute("KAPTCHA_SESSION_KEY", code);

在这段代码中:

  • createText = defaultKaptcha.createText();:生成验证码文本,例如:1+1=?@2。
  • capStr = createText.substring(0, createText.lastIndexOf("@"));:获取运算表达式部分,即1+1=?。
  • code = createText.substring(createText.lastIndexOf("@") + 1);:获取运算结果部分,即2。
  • httpServletRequest.getSession().setAttribute("KAPTCHA_SESSION_KEY", code);:将运算结果保存到session中,用于后续的验证。

通过这种方式,我们可以将验证码的运算表达式和结果分离开来,用户看到的是表达式部分,而验证时使用的是结果部分。

生成的验证码如下图所示:

5. 总结

通过上述步骤,我们实现了一个自定义的Kaptcha图片验证码生成器,该生成器可以生成包含100以内的加减乘除运算的验证码。通过这种方式,我们不仅可以提高验证码的安全性,还能增强用户体验。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计