登录验证码的实现

为了防止黑客暴力破解账号密码,验证码应运而生,它可以有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断地登陆尝试,下面我们实现一种比较简单也是比较常见的验证码登录功能。

简单说一下实现步骤:

  1. 创建图片验证码工具类
  2. 实现获取验证码接口
  3. 实现登录接口对验证码验证

创建工具类

import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.util.Random;/** * 验证码生成工具 */public class CaptchaUtil { private BufferedImage image;// 图像 private String str;// 验证码 private static char code[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789".toCharArray(); public static final String SESSION_CODE_NAME="code"; private CaptchaUtil() { init();// 初始化属性 } /* * 取得RandomNumUtil实例 */ public static CaptchaUtil Instance() { return new CaptchaUtil(); } /* * 取得验证码图片 */ public BufferedImage getImage() { return this.image; } /* * 取得图片的验证码 */ public String getString() { return this.str; } private void init() { // 在内存中创建图象 int width = 85, height = 20; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = image.getGraphics(); // 生成随机类 Random random = new Random(); // 设定背景色 g.setColor(getRandColor(200, 250)); g.fillRect(0, 0, width, height); // 设定字体 g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); // 随机产生干扰线,使图象中的认证码不易被其它程序探测到 g.setColor(getRandColor(160, 200)); g.setColor(getRandColor(100, 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位数字) String sRand = ""; for (int i = 0; i < 4; i++) { String rand = String.valueOf(code[random.nextInt(code.length)]); sRand += rand; // 将认证码显示到图象中 g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110))); // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.drawString(rand, 13 * i + 6, 16); } // 赋值验证码 this.str = sRand; // 图象生效 g.dispose(); this.image = image;/* 赋值图像 */ } /* * 给定范围获得随机颜色 */ private 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); }}

实现验证码获取接口

因为现在大部分应用都涉及分布式部署,所以使用redis缓存验证码。随机生成UUID作为redis的key返回给前端,通过登录接口拿到UUID和图片验证码进行校验。

@GetMapping("/captchaImage") public ResponseEntity<?> createCode() throws IOException { CaptchaUtil util = CaptchaUtil.Instance(); String code = util.getString(); String uuid = IdUtils.simpleUUID(); // 将验证码存入redis String verifyKey = Constants.CAPTCHA_CODE_KEY + uuid; sessionUtil.setVerifyCode(verifyKey, code, config.getCaptchaExpiration()); ByteArrayOutputStream stream = new ByteArrayOutputStream(); ImageIO.write(util.getImage(), "jpg", stream); String base64 = Base64.encode(stream.toByteArray()); JSONObject captchaInfo = new JSONObject(); captchaInfo.put("uuid", uuid); captchaInfo.put("img", base64); return RespResult.ok(captchaInfo); }

登录接口验证

// 图片验证码校验 String verifyKey = Constants.CAPTCHA_CODE_KEY + loginBody.getUuid(); // 获取验证码接口返回的UUID String cacheCode = sessionUtil.getVerifyCode(verifyKey); if (loginBody.getCode() == null || !loginBody.getCode().equalsIgnoreCase(cacheCode)){ throw new CaptchaException(); }

验证码效果

登录验证码的后台实现

图片验证码

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:dandanxi6@qq.com

(0)
上一篇 2023年 6月 7日 上午10:34
下一篇 2023年 6月 7日 上午10:40

相关推荐

  • 美团外卖骑手刷脸上线怎么避免

    互联网时代之下, 我们的生活变得更加方便和快捷,而“外卖”也成为大多数人生活中不可缺少的一部分,而在外卖行业兴起之后,也催生了庞大的外卖员群体。 几个月前,《外卖骑手,困在系统里 …

    2023年 2月 25日
  • 手机纳米镀膜是真的吗怎么分辨(手机纳米镀膜)

    很多想选择小本创业的朋友,都想选择一个不需要压货,而且比较吸引人的一个项目,我也是在夜市当中看到了手机纳米镀膜技术。当时很感兴趣,就在摊位前做了一个,自己用了半个月感觉还挺好。于是…

    2023年 3月 2日
  • 图片如何加边框分享几个简单方法

    我们经常会给拍完的照片加上一个边框,这样做可以让是我们的图片比原来更加的美观,更能突出图片的意境、格调等等,使图片富有一点艺术感,那你知道如何给图片加边框吗?下面就让我来为大家简单…

    2023年 5月 24日
  • 百态|从入门到精通,MAD制作者的养成 – Alice映画-千枼草_阑小逝

    Whitest Boy on the Beach 第一次和千枼见面是在一家烧烤店里,前段时间听说他将公司搬到了上海,互相你来我往聊了几次,总算约好了时间,店里放着略有些嘈杂的音乐,…

    2023年 7月 18日
  • 李易峰吴亦凡身高对比照

    鹿晗微博转发量破吉尼斯世界纪录,王俊凯过生日收十八颗星星做礼物。路人不明所以感叹明星能上天,但真正厉害的还是粉丝,捧谁谁上天。 粉丝乐于分享他们眼中完美的偶像,也因为喜欢而容不得半…

    2023年 9月 23日
  • 微信8.0我的状态怎么设置背景

    微信8.0版本新增“我的状态”玩法,该功能还有修改背景图的隐藏玩法,自由选择喜欢的照片,还可以模糊一下处理,然后添加心情和动态就是自己的个性标签,怎么更改状态背景图?下面带来介绍。…

    2023年 3月 5日
  • mua是什么意思

    聊天时看见mua,有些人可以直接领会到其中的含义,而有些人也会一脸问号,想求解mua什么意思?特别是女生对你说mua代表什么含义?现在我们就一起来看看女生对你说mua可能代表的含义…

    互联网 2022年 12月 17日
  • 支付宝语音助手在哪里,支付宝最新版本的语音功能

    经过一周左右的内测,今天支付宝正式在官网上线了9.9新版,iOS、Android齐发,大家可以下载更新了。ps.应该已经有不少用户收到了更新推送。根据我们之前的体验评测,支付宝9….

    2023年 3月 10日
  • 表格的使用技巧和应用,表格常用技巧大全

    作为一名打工人,表格算是每天使用频率很高的一种文件格式了,但是有很多朋友还是没有掌握它的使用技巧。 今天我就跟大家分享5个实用的表格技巧,每一个都是工作中常见的问题哦! ▶ 显示隐…

    2023年 3月 20日
  • vim命令超清壁纸

    1.移动光标 l或 Right 向右移动⼀个字符 h或 Left 向左移动⼀个字符 j或 Down 向下移动⼀⾏ k或 Up 向上移动⼀⾏ 0 移动到当前⾏的⾏⾸ [[ 移动到代码…

    2023年 5月 24日