五分钟带你玩转SpringSecurity(十一)全网最全!带你掌握随机颜色与计算方式的验证码

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: 五分钟带你玩转SpringSecurity(十一)全网最全!带你掌握随机颜色与计算方式的验证码


上文我们使用Kaptcha定制验证码 ,但是样式有些low,甚至很难看清。测试的小伙伴纷纷抗议。。。

解决方案:1:定制验证码的样式,如字体,字号,间隔,颜色等

                 2:使用数字运算代替字母

之前的验证码

image.png

更改后的验证码

image.png

废话不多说 上代码:

KaptchaImageCodeConfig

Kaptcha配置 重点代码为properties.setProperty("kaptcha.textproducer.impl", "com.core.code.KaptchaTextCreator"); 含义是指定生成验证码的逻辑

@Configuration
public class KaptchaImageCodeConfig {
    @Bean
    public DefaultKaptcha getDefaultKaptcha() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // 是否有边框 默认为true 我们可以自己设置yes,no
        properties.setProperty("kaptcha.border", "yes");
        // 边框颜色 默认为Color.BLACK
        properties.setProperty("kaptcha.border.color", "105,179,90");
        // 验证码图片宽度 默认为200
        properties.setProperty("kaptcha.image.width", "200");
        // 验证码图片高度 默认为50
        properties.setProperty("kaptcha.image.height", "36");
        // 验证码文本字符颜色 默认为Color.BLACK
        properties.setProperty("kaptcha.textproducer.font.color", "red");
        // 验证码文本字符大小 默认为40
        properties.setProperty("kaptcha.textproducer.font.size", "36");
        // 验证码文本生成器(生成验证码规则类的位置) 重点!!!!
        properties.setProperty("kaptcha.textproducer.impl", "com.core.code.KaptchaTextCreator");
        // 验证码文本字符间距 默认为2
        properties.setProperty("kaptcha.textproducer.char.space", "3");
        // 验证码文本字符长度 默认为5
        properties.setProperty("kaptcha.textproducer.char.length", "6");
        // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
        properties.setProperty("kaptcha.textproducer.font.names", "彩云,宋体,楷体,微软雅黑");
        // 验证码噪点颜色 默认为Color.BLACK
        properties.setProperty("kaptcha.noise.color", "white");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

KaptchaTextCreator

也就是上文对应的验证码逻辑类,该类的逻辑为 生成10以内的运算

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();
    }
}

CustomCreatImage

当传入验证码之后,随机生成每个字符的颜色,样式。

@Component
public class CustomCreatImage {
    private static final long serialVersionUID = 1L;
    //给定范围获得随机颜色
    public Color getRandColor(int fc, int bc) {
        Random random = new Random();
        if (fc > 255) {
            fc = 255;
        }
        if (bc > 255) {
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }
    public BufferedImage creatImage(String code) {
        int width = 200, height = 40;
        //生成随机类
        Random random = new Random();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        //获取图形上下文
        Graphics g = image.getGraphics();
        // 设定背景色
        g.setColor(getRandColor(200, 250));
        g.fillRect(0, 0, width, height);
        //设定字体 第二个参数为字体为加粗
        g.setFont(new Font("Times New Roman", Font.BOLD, 45));
        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
        g.setColor(getRandColor(160, 200));
        for (int i = 0; i < 155; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = random.nextInt(12);
            int yl = random.nextInt(12);
            g.drawLine(x, y, x + xl, y + yl);
        }
        // 取随机产生的认证码(4位数字)
        for (int i = 0; i < code.length(); i++) {
            String rand = code.substring(i, i + 1);
            // 将认证码显示到图象中
            g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
            //调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
            g.drawString(rand, 30 * i + 18, 35);
        }
        // 图象生效
        g.dispose();
        return image;
    }
}

CodeController

验证码调用的接口

@Controller
public class CodeController {
    Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    CustomCreatImage customCreatImage;
    @Autowired
    private DefaultKaptcha defaultKaptcha;
    @RequestMapping("/code/image")
    public void imageCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 1. 获取验证码
        String capStr = null;
        String code = null;
        //此处调用的是KaptchaTextCreator规则
        String capText = defaultKaptcha.createText();
        // 显示的验证码
        capStr = capText.substring(0, capText.lastIndexOf("@"));
        // 运算结果
        code = capText.substring(capText.lastIndexOf("@") + 1);
        logger.info("生成的图形验证码是:" + code);
        // 2. 字符串把它放到session中
        request.getSession().setAttribute(CODE_SESSION_KEY, code);
        // 3. 获取验证码图片
        BufferedImage image = customCreatImage.creatImage(capStr);
        // 4. 将验证码图片把它写出去
        ServletOutputStream out = response.getOutputStream();
        ImageIO.write(image, "jpg", out);
    }
}


相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
4月前
|
存储 前端开发 Java
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
本文介绍了使用Kaptcha插件在SpringBoot项目中实现验证码的生成和验证,包括后端生成验证码、前端展示以及通过session进行验证码校验的完整前后端代码和配置过程。
561 0
验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)
|
存储
​SpringSecurity-7-自定义AuthenticationProvider实现图形验证码
上一章节我们介绍了如何使用过滤器(Filter)实现图形验证,这是属于Servlet层面,比较简单容易理解。那么这次我们介绍SpringSecurity提供的另一种比较高端的实现图形化验证码,这就是AuthenticationProvider自定义认证。
185 0
|
前端开发
前端学习笔记202307学习笔记第六十天-实现第一种调试方式2
前端学习笔记202307学习笔记第六十天-实现第一种调试方式2
58 0
|
前端开发
前端学习笔记202307学习笔记第六十天-实现第一种调试方式1
前端学习笔记202307学习笔记第六十天-实现第一种调试方式1
62 0
|
机器学习/深度学习 缓存 NoSQL
前后端分离java开发图形验证码+谷歌开源Kaptcha使用(Springboot+redis实现图形验证码校验)
前后端分离java开发图形验证码+谷歌开源Kaptcha使用(Springboot+redis实现图形验证码校验)
819 0
|
前端开发
前端学习笔记202304学习笔记第七天-了解自定义验证函数
前端学习笔记202304学习笔记第七天-了解自定义验证函数
75 0
|
前端开发
前端学习笔记202304学习笔记第七天-自定义验证函数
前端学习笔记202304学习笔记第七天-自定义验证函数
77 0
|
搜索推荐 前端开发 API
这个验证码合集,从图形到行为验证,你想要的都有-KgCaptcha
凯格行为验证码 - KgCaptcha,采用业界通用的API接口方式,对接轻松简单,即可享受带来的产品服务能力。自定义样式及风控等级,完全个性化的设置,与你的应用完美融合。
这个验证码合集,从图形到行为验证,你想要的都有-KgCaptcha
|
消息中间件 JavaScript 小程序
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
|
Java 数据安全/隐私保护 Windows
【Java实验五】字符串加密、模拟用户登录、生成验证码、春节倒计时等
1、实验题目:字符串加密 键盘输入一个原始字符串作为明文,然后使用加密方法加密,再对加密字符串进行解密。样例如下图,加密方法自定,完成其功能并测试。
174 0