Java实现拖拉/滑动图片验证码

环境条件

  1. JDK1.8
  2. MAVEN-3.3
  3. spring-boot-2.1.17.RELEASE
  4. Redis

源码+DEMO+单元测试下载地址(有问题可关注并私信博主解决)

https://download.csdn.net/download/m0_38138879/19386954

用户行为验证码(拖动图片)

实现思路

1.一个文件夹存储大小一致的背景图;另外一个文件存储高度跟背景图一致,但是宽度不一致的拖动图(需要UI将空白位置设置为透明);上述两文件夹支持可配置路径和容错的默认路径.



2.项目启动完成时一次性全部背景图和拖动图转为字节或Base64缓存起来(可改为redis);前端请求图片验证码时候在随机取缓存中的一张背景图片和一张拖动图。

private void cacheBackgroundImage(){if(StrUtil.isNotBlank(config.getBackgroundImagePath())&& FileUtil.isDirectory(config.getBackgroundImagePath())){log.info("开始加载文件路径为:{}的拖拉验证码背景图..",config.getBackgroundImagePath());for(File file :FileUtil.loopFiles(config.getBackgroundImagePath())){if(file.isDirectory()){continue;}BASE64_BACKGROUND_IMAGE.put(file.getName(), Base64.encode(file));}log.info("完成加载文件路径为:{}的拖拉验证码背景图..",config.getBackgroundImagePath());}//加载默认的背景图if(BASE64_BACKGROUND_IMAGE.isEmpty()){log.info("开始加载默认路径为:defaultImage/background/的5张拖拉验证码背景图..");BASE64_BACKGROUND_IMAGE.put("1.jpg",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/background/1.jpg"),true)));BASE64_BACKGROUND_IMAGE.put("2.jpg",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/background/2.jpg"),true)));BASE64_BACKGROUND_IMAGE.put("3.jpg",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/background/3.jpg"),true)));BASE64_BACKGROUND_IMAGE.put("4.jpg",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/background/4.jpg"),true)));BASE64_BACKGROUND_IMAGE.put("5.jpg",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/background/5.jpg"),true)));log.info("完成加载默认路径为:defaultImage/background/的5张拖拉验证码背景图..");}}private void cacheDraggedImage(){if(StrUtil.isNotBlank(config.getDraggedImagePath()) && FileUtil.isDirectory(config.getDraggedImagePath())){log.info("开始加载文件路径为:{}的拖拉验证码拼图..",config.getDraggedImagePath());for(File file :FileUtil.loopFiles(config.getDraggedImagePath())){if(file.isDirectory()){continue;}BASE64_DRAGGED_IMAGE.put(file.getName(), Base64.encode(file));}log.info("完成加载文件路径为:{}的拖拉验证码拼图..",config.getDraggedImagePath());}//加载默认的拼图if(BASE64_DRAGGED_IMAGE.isEmpty()){log.info("开始加载默认路径为:defaultImage/dragged/的11张拖拉验证码拼图..");BASE64_DRAGGED_IMAGE.put("1.png",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/dragged/1.png"),true)));BASE64_DRAGGED_IMAGE.put("2.png",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/dragged/2.png"),true)));BASE64_DRAGGED_IMAGE.put("3.png",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/dragged/3.png"),true)));BASE64_DRAGGED_IMAGE.put("4.png",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/dragged/4.png"),true)));BASE64_DRAGGED_IMAGE.put("5.png",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/dragged/5.png"),true)));BASE64_DRAGGED_IMAGE.put("6.png",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/dragged/6.png"),true)));BASE64_DRAGGED_IMAGE.put("7.png",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/dragged/7.png"),true)));BASE64_DRAGGED_IMAGE.put("8.png",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/dragged/8.png"),true)));BASE64_DRAGGED_IMAGE.put("9.png",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/dragged/9.png"),true)));BASE64_DRAGGED_IMAGE.put("10.png",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/dragged/10.png"),true)));BASE64_DRAGGED_IMAGE.put("11.png",Base64.encode(IoUtil.readBytes(ClassUtil.getClassLoader().getResourceAsStream("defaultImage/dragged/11.png"),true)));log.info("完成加载默认路径为:defaultImage/dragged/的11张拖拉验证码拼图..");}}

3.以拖动图大少新建一张背景为透明的拖动图,以背景图的宽度和拖拉图宽度为基础随机生成一个背景图的抠图X1开始坐标。循环拖拉图的每个像素,如果这个坐标X:Y为非透明的RGB,采集背景X1+X:Y的RGB并设置到新建的拖拉图,在设置背景图 X1+1:Y坐标的RGB为黑色(也可用高斯模糊算法去模糊)。将已抠图的背景图和新建的拖动图BASE64返回前端+额外一个令牌;且用Redis以令牌为key对该随机开始抠图的坐标X1存储和根据配置设置过期时间(默认3分钟,为图片验证码的有效期)

int pointX = createPointX(backgroundImageWidth,draggedImageWidth,backgroundImageHeight,draggedImageHeight);
for(int i=0;i<draggedImageWidth;i++){for (int j=0;j<draggedImageHeight;j++){int rgb = draggedImageTemplate.getRGB(i,j);if(rgb <0){//非透明int backgroundRGB = backgroundImage.getRGB(pointX+i,j);draggedImage.setRGB(i,j,backgroundRGB);backgroundImage.setRGB(pointX+i,j,Color.DARK_GRAY.getRGB());}}
}


4.前端利用后端返回的背景图和拖动图,实现拖动事件;就是鼠标按下、移动、松开;当鼠标松开时候记录对于背景图滑动的坐标X。并将坐标X(建议加密)和3步骤返回的令牌发给后端;后端检查该图片验证码是否过期、对比用户拖动的X坐标和redis记录的X坐标是否在重合,容许5尺寸的偏差。

技术核心要点

  1. JAVA需熟悉AWT的BufferedImage、Graphics2D、Font;Redis。
  2. 前端实现拖动事件和拖动的X坐标.
  3. 坐标信息传输用AES或DES进行加密。

demo截图

  1. 输入账号、密码点击登录,弹出拖动验证码窗口

  2. 拖动都背景图缺少位置

  3. 如果未拖动到缺少位置的5尺寸差内,提示验证码错误并前端自动刷新拖拉图片验证码

Java实现拖拉/滑动图片验证码相关推荐

  1. 怎样用Java自制优秀的图片验证码?这样!

    Completely Automated Public Turing test to tell Computers and Humans Apart 全自动区分计算机和人类的图灵测试 简称CAPTCH ...

  2. WordPress登录注册评论滑动图片验证码插件腾讯云验证码(CAPTCHA)

    为了网站安全我们一般会在登录页.注册页.评论页添加验证码功能,传统的验证码都是输入字母数字或加减法等,现在比较流行图片滑动验证码.最为关键的是腾讯云提供有图形验证(图片滑动验证码)服务器(一年内提供几 ...

  3. Java 生成滑动图片验证码, 阴影, 切块

    1, 效果 图片都是280x210 2, 切图工具 import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import ...

  4. java 解析滑动验证码图片_滑动图片验证码demo

    [实例简介] 极验验证更改后的版本,该demo导入eclipse直接可用,带有详细使用说明文档,验证通过发送短信 [实例截图] [核心代码] 极验验证使用说明 └── 极验验证使用说明 ├── gt- ...

  5. vue中纯前端实现滑动图片验证的方式

    Hello,大家好呀~ 众所周知,滑动图片验证一直是各类网站登录和注册的一种校验方式,是用来防止有人恶意使用脚本批量进行操作从而设置的一种安全保护方式. 一般而言,这种滑动图片验证是可以通过后端配合完 ...

  6. java 滑块验证码 开源,Java AWT生成滑动验证码

    最近工作需要在登录时使用滑动验证码做登录校验,在生成验证码图片的时候碰到了不小的麻烦 : (. 网上能查到的做法基本上都是使用一张已存在的实际图片作为滑块的图形模板,然后按照此模板做二重循环逐像素地从 ...

  7. java爬取验证码图片_JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取)...

    JAVA HttpClient实现页面信息抓取(获取图片验证码并传入cookie实现信息获取) 发布时间:2018-05-18 16:41, 浏览次数:632 , 标签: JAVA HttpClien ...

  8. 图片验证码的JAVA工具类

    我们平时开发时经常会遇到需要图片验证码,基础的验证码包括了数字.字母.甚至可能有汉字.下面我给出一个简单的工具类. package com..ankang.tony.util;import java. ...

  9. 用Java实现图片验证码功能

    一.什么是图片验证码? 可以参考下面这张图: 我们在一些网站注册的时候,经常需要填写以上图片的信息. 1.图片生成实体类: 1 package com.hexianwei.graphic; 2 3 i ...

  10. Java中使用图片验证码 --菜鸟小回

    Java中使用图片验证码 一.第一种方式 工具类 @WebServlet("/BufferImage") public class BufferImage extends Http ...

最新文章

  1. mysql中utf8_bin、utf8_general_ci、utf8_general_cs编码区别
  2. 【青少年编程竞赛交流】11月份微信图文索引
  3. go http的按序号发送,按序号接收
  4. R语言:rep函数解析
  5. 【论文复现与改进】针对弱标注数据多标签矩阵恢复问题,改进后的MCWD算法,让你的弱标注多标签数据赢在起跑线上
  6. 使用ILmerge合并Exe、Dll文件的帮助类
  7. VUE2 第五天学习--过渡效果
  8. 深度解析大型分布式电商网站演变过程以及构架部署解决方案
  9. 中移4G模块-ML302-OpenCpu开发-服务器搭建
  10. 用最简单直白的人类语言解释下jsonP到底是什么鬼
  11. Ubuntu中DenyHosts安装及配置
  12. Dijkstra最短路径
  13. spacemacs project设置
  14. 三方支付 微信支付 支付宝支付 银联支付 分享
  15. 倒立摆源代码仿真matlab/simulink神经网络PID(模糊)控制校正LQR 神经网络 倒立摆控制 倒立摆LQR控制仿真 单级倒立摆的模糊控制 旋转倒立摆
  16. DDA算法--计算机图形学
  17. vscode vim插件(updating)
  18. 基于VUE + Echarts 实现可视化数据大屏智慧校园可视化
  19. 事件循环、webpack、vue<前端学习笔记>
  20. 【转载】CodeWarrior IDE使用Tips-如何编译生成和调用静态库

热门文章

  1. 笔记本电脑怎么录制屏幕
  2. python酷q机器人_酷Q机器人实时热点Python源码
  3. hmcl手机版_hmcl启动器正版
  4. 工程伦理2021秋期末考答案|网课期末考答案|学堂在线|清华大学李正风教授
  5. 计算机将图像数字化的原理,图像数字化
  6. Kali下的钓鱼工具setoolkit和社工字典工具Cupp
  7. [转载]《Linux Kernel Development》读书笔记 - 蔚蓝海岸 - C++博客
  8. 祭十大已经逝去的软件
  9. 微信小程序中如何应用音频
  10. html中怎样滚动图片,CSS如何实现滚动的图片栏(代码实例)