需求:后端系统登录时使用图片验证码验证登录

效果:

使用 4 位数字加字母组合验证码登录,相关代码为:

import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;@RequestMapping("/getCode")
public ResultVO getCode(HttpServletRequest request, HttpServletResponse response) {String imageBase64 = "";Map<String, String> result = new HashMap<>();try {// 定义图片大小LineCaptcha captcha = CaptchaUtil.createLineCaptcha(200, 100, 4, 300);response.setContentType("image/jpeg");response.setHeader("Pragma", "No-cache");imageBase64 = "data:image/png;base64," + captcha.getImageBase64();String code = captcha.getCode();logger.info("生成的图片验正码:{}", code);String codeKey = UUID.randomUUID().toString();redisSupport.set(codeKey, captcha.getCode());result.put("code",imageBase64);result.put("codeKey", codeKey);} catch (Exception e) {logger.error("生成图片验正码异常", e);return new ResultVO<>(ResultVO.FAIL, "获取图片失败");}return new ResultVO<>(result, ResultVO.SUCCESS, "获取图片成功");
}

这部分代码实现的是生成图片验证码的功能,使用的是 hutool 的工具包,需要以 key-value 的形式将生成的图片和用户关联起来,所以我们将结果以 Map 的形式返回给前端。其中使用的 redisSupport 可根据实际情况进行替换,其实就是 Redis 的一个工具包,后续会单独贴出来。  Redis 工具包请参考文章:Redis 工具实用篇_jiaomubai的博客-CSDN博客

正式登录接口的代码如下:

@PostMapping("/login")
public void login(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("code") String code, @RequestParam("codeKey") String codeKey, HttpServletResponse resp, HttpServletRequest request) {JSONObject result = new JSONObject();try {String redisCode = (String) redisSupport.get(codeKey);log.info("redisCode:{}",redisCode);if(StringUtils.isEmpty(code)  || StringUtils.isEmpty(redisCode) || !code.equals(redisCode)){result.put("error_description", "验证码错误");result.put("error", "invalid_grant");resp.setStatus(400);redisSupport.del(codeKey);return;}} catch (Exception e) {log.error("登录接口错误,错误信息:{}", e);} finally {try {resp.setContentType(ContentType.JSON.getValue());ServletOutputStream out = resp.getOutputStream();OutputStreamWriter ow = new OutputStreamWriter(out, "UTF-8");ow.write(result.toJSONString());ow.flush();ow.close();} catch (Exception e) {log.error("登录接口错误,错误信息:{}", e);}}
}

其中入参中 username 为登录的用户名,password 为登录密码,code 为用户输入的图片验证码的答案,codekey 为与 code 关联的 key,因为在获取验证码的接口中(/getCode)我们已经将 code 和 codekey 存储在了 Redis 中,所以此处可直接根据 codekey 去获取 Redis 中的与 codekey 对应的验证码,之后与用户输入的 code 进行比较即可。其中使用的 redisSupport 可根据实际情况进行替换,其实就是 Redis 的一个工具包,后续会单独贴出来。 Redis 工具包请参考文章:Redis 工具实用篇_jiaomubai的博客-CSDN博客

还有一种使用简单运算的登录验证方式在下一篇文章中说明~

使用图片验证码进行登录验证相关推荐

  1. SSM 实训笔记 -10- 使用 sessionStorage 存储数据、js 图片验证码、登录加载动画

    SSM 实训笔记 -10- 使用 sessionStorage 存储数据.js 图片验证码.登录加载动画 本篇内容: (1)在登录成功时,使用 sessionStorage 存储用户的用户名,并在登录 ...

  2. 手机验证码+Redis登录验证+token+登录拦截

    手机验证码+Redis登录验证+token+登录拦截 文章目录 手机验证码+Redis登录验证+token+登录拦截 解决方案 思想 以阿里云为例 1.阿里云官网开通短信服务 2.创建签名 3.创建短 ...

  3. python—简单数据抓取四(利用超级鹰的ocr识别图片验证码模拟登录超级鹰网站、利用百度云的ocr识别自如租房网价格图片获取到自如网的价格)

    学习目标: python学习二十四 -简单数据抓取四 学习内容: 1.利用超级鹰的ocr识别图片验证码模拟登录超级鹰网站 2.利用百度云的ocr识别自如租房网的价格图片,获取到自如网的价格数据 1.利 ...

  4. python 验证码图片 模拟登录_【python】带图片验证码的登录自动化实战

    近期在跟进新项目的时候,整体的业务线非常之长,会一直重复登录退出不同账号的这个流程,所以想从登录开始实现部分的自动化.因为是B/S的架构,所以采用的是selenium的框架来实现.大致实现步骤如下: ...

  5. 爬虫笔记40之反爬系列三:复杂验证码的处理(12306图片验证码、行为验证:selenium鼠标行为链 + 算法)

    一.12306图片验证码 ​ 解决方案: selenium(鼠标行为链) + 打码平台 ​ 思路: 通过selenium来加载登录页面,获取验证码图片.我就可以把验证码图片交给超级鹰打码平台进行处理. ...

  6. 校验验证码 实现登录验证

    验证码处理 方式 1.手动处理 2.云打码平台自动识别验证码 实现流程:-1.对携带验证码的页面数据进行抓取-2.可以将验证码图片进行解析,验证码图片下载到本地-3.将验证码图片交给第三方进行识别,返 ...

  7. javaweb利用servlet与struts2实现可点击刷新的基础图片验证码

    javaweb利用servlet实现图片验证码 验证码是登录验证的技术,可以一定程度防止恶意脚本刷网站,造成服务器压力. 具体实现思想很简单: 首先利用servlet产生一个随机的验证码, 保存在se ...

  8. 【Spring Security OAuth2笔记系列】- spring security - 图片验证码

    图片验证码 在登录界面图形添加验证码 开发生成图像验证码接口 在认证流程中加入图像验证码校验 重构代码 开发生成图像验证码接口 思路: * 根据随机数生成图片 * 将随机数存到session中 * 将 ...

  9. Django之头像实时展示到input框、图片验证码、简单发邮件

    一.以注册功能来看头像实时展示 首先先来写一个简单的页面: <div class="container-fluid"><div class="row&q ...

  10. python 登陆网站图片验证,用python登录带弱图片验证码的网站

    上一篇介绍了使用python模拟登陆网站,但是登陆的网站都是直接输入账号及密码进行登陆,现在很多网站为了加强用户安全性和提高反爬虫机制都会有包括字符.图片.手机验证等等各式各样的验证码.图片验证码就是 ...

最新文章

  1. MAC OSX10.9.2上搭建Apache,php
  2. SCOI2019AFO记
  3. Redis(5种数据类型)
  4. ClickHouse 分布式原理:Distributed引擎
  5. 为什么map对象不能使用stl中的sort函数
  6. 如何在iPhone和iPad上允许“不受信任的快捷方式”
  7. Hadoop入门(二十)Mapreduce的最小值程序
  8. 判断字符串是否为空--string.Empty、string=、s.length==0
  9. linux 磁盘监控,9个在Linux中监视Linux磁盘分区和用法的工具
  10. element-ui 源码学习
  11. 希望你婚后的每一天我都能过得快乐。。。
  12. 在哪里可以查询中国某一地区的历史气象数据(过去15年,如降雪,降雨等)?
  13. 利用xposed自动获得微信个人收款二维码链接和收款记录
  14. js中获取当前屏幕宽度方法如下:
  15. 软件工程-软件维护/系统维护
  16. FPS游戏:封装外部D3D透视模块
  17. 生物信息(bioinformation)学名词解释
  18. red5搭建流媒体直播系统
  19. 10bit视频编码——特性及全面播放方法介绍
  20. 计算机硬盘hs申报要素,实例手把手教你填报HS编码和申报要素

热门文章

  1. jpg格式如何转eps路径_jpg/png格式图片转eps格式的方法总结
  2. 关于wince/mobile 同步软件XP activesync ,WindowsMobile设备中心的连接问题分析
  3. html文件中flash视频格式(flv、swf)文件的嵌入方法
  4. windows安装和配置阿帕奇+PHP服务器
  5. 网卡驱动程序igb和ixgbe
  6. 随滚动条移动的QQ在线客服代码
  7. iOS越狱开发----iOS越狱原理详解
  8. 研华工控台式计算机选型,工控机选型手册.pdf
  9. 便携式频谱仪无人机机载频谱仪解决方案
  10. FlashFXP v3.5.4注册码+FlashFXP v3.6.0注册码+FlashFXP v3.7.2.build.1266...