目录

一、配置文件

二、图片

三、代码实现


前后端代码:

java滚动验证码-前端和后端完整版_outdata的博客-CSDN博客_java图片滚动验证

图形滑动验证码JAVA实现【前后端结合】_LeonardoZzzz的博客-CSDN博客_滑动验证码完成安全验证

一、配置文件


#验证码图片地址,需要改成你本地的地址
#路径调试的时候,配成全路径,不要配成相对路径。相对路径打成jar包的时候,读取不到文件
#这是前后端分离方式的调用,路径应该由服务器来配置,这里需要手动配置路径。其它方式读取文件,可自行调整CaptchaServiceImpl实现类中selectSlideVerificationCode方法文件读取方式
captcha:slide-verification-code:path:template-image: "/static/templates"origin-image: "/static/targets"

二、图片

三、代码实现

import com.aliyun.oss.ServiceException;
import com.lgh.code.common.model.base.Result;
import com.lgh.universal.service.ImageVerificationService;
import com.lgh.universal.util.ImageVerificationCheckDTO;
import com.lgh.universal.util.ImageVerificationVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;/*** @author: cyl* @date: 2022/3/22 16:17*/
@RestController
@RequestMapping(value = "/image/verification")
@Api(tags = "图片滑动验证码")
@Slf4j
@RequiredArgsConstructor
public class ImageVerificationController {private final ImageVerificationService service;@GetMapping("/get")@ApiOperation(value = "获取验证码")public Result getVerificationImage() {ImageVerificationVO vo;try {vo = service.selectSlideVerificationCode();} catch (ServiceException e) {return Result.fail(e.getMessage());}return Result.ok(vo);}@ApiOperation(value = "校验验证码")@PostMapping("/check")public Result checkVerificationResult(@Valid @RequestBody ImageVerificationCheckDTO dto) {return service.checkVerificationResult(dto.getX(), dto.getY());}}
import com.aliyun.oss.ServiceException;
import com.lgh.code.common.constant.RedisConstants;
import com.lgh.code.common.constant.TokenTimeConstants;
import com.lgh.code.common.context.SecurityContextHolder;
import com.lgh.code.common.model.base.Result;
import com.lgh.code.redis.service.RedisService;
import com.lgh.universal.util.ImageRead;
import com.lgh.universal.util.ImageVerificationUtil;
import com.lgh.universal.util.ImageVerificationVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.stereotype.Service;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.net.URL;
import java.util.Random;/*** 图片滑动验证码 业务实现类* @author: cyl* @date: 2022/3/22 16:28*/
@Service
@Slf4j
@RequiredArgsConstructor
public class ImageVerificationService {private final RedisService redisService;/*** 源图路径前缀*/@Value("${captcha.slide-verification-code.path.origin-image:classpath:static/targets}")private String verificationImagePathPrefix;/*** 模板图路径前缀*/@Value("${captcha.slide-verification-code.path.template-image:classpath:static/templates}")private String templateImagePathPrefix;/*** 获取滑动验证码** @return 滑动验证码*/public ImageVerificationVO selectSlideVerificationCode() throws ServiceException {ImageVerificationVO vo;try {//  随机取得原图文件夹中一张图片ImageRead originImageRead = readTargetImage();//  获取模板图片文件ImageRead templateImageRead = readTemplateImage(templateImagePathPrefix.concat("/template.png"));//  获取描边图片文件ImageRead borderImageRead = readBorderImageFile(templateImagePathPrefix.concat("/border.png"));//  获取原图文件类型String originImageFileType = originImageRead.getFileExtension();//  获取模板图文件类型String templateImageFileType = templateImageRead.getFileExtension();//  获取边框图文件类型String borderImageFileType = borderImageRead.getFileExtension();//  读取原图BufferedImage verificationImage = originImageRead.getImage();//  读取模板图BufferedImage readTemplateImage = templateImageRead.getImage();//  读取描边图片BufferedImage borderImage = borderImageRead.getImage();//  获取原图感兴趣区域坐标vo = ImageVerificationUtil.generateCutoutCoordinates(verificationImage, readTemplateImage);int y = vo.getY();redisService.set(RedisConstants.IMAGE_VERIFICATION + SecurityContextHolder.getUserId(), vo, TokenTimeConstants.MILLIS_MINUTES);//  根据原图生成遮罩图和切块图vo = ImageVerificationUtil.pictureTemplateCutout(verificationImage, originImageRead.getInputStream(), originImageFileType, readTemplateImage, templateImageFileType, vo.getX(), vo.getY());//   剪切图描边vo = ImageVerificationUtil.cutoutImageEdge(vo, borderImage, borderImageFileType);vo.setY(y);//  =============================================//  输出图片
//            HttpServletResponse response = getResponse();
//            response.setContentType("image/jpeg");
//            ServletOutputStream outputStream = response.getOutputStream();
//            outputStream.write(oriCopyImages);
//            BufferedImage bufferedImage = ImageIO.read(originImageFile);
//            ImageIO.write(bufferedImage, originImageType, outputStream);
//            outputStream.flush();//  =================================================} catch (Exception e) {log.error(e.getMessage(), e);throw new ServiceException(e.getMessage());}return vo;}/*** 读取目标图** @return* @throws ServiceException*/public ImageRead readTargetImage() throws ServiceException {ImageRead imageRead = null;try {Random random = new Random(System.currentTimeMillis());log.info("读取目标图: {}", verificationImagePathPrefix);ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource[] resources = resolver.getResources(verificationImagePathPrefix.concat("/*"));if (resources == null) {throw new RuntimeException("not found target image");}int i = random.nextInt(resources.length);imageRead = new ImageRead();imageRead.setImage(ImageIO.read(resources[i].getInputStream()));String extension = resources[i].getFilename().substring(resources[i].getFilename().lastIndexOf(".") + 1);imageRead.setInputStream(resources[i].getInputStream());imageRead.setFileExtension(extension);log.info("读取目标图: 完成");} catch (Exception e) {log.error(e.getMessage(), e);throw new ServiceException(e.getMessage());}return imageRead;}/*** 读取模板图** @param path* @return* @throws ServiceException*/public ImageRead readTemplateImage(String path) throws ServiceException {ImageRead templateImageFile = null;try {if (templateImageFile != null) {return templateImageFile;}templateImageFile = new ImageRead();log.info("读取模板图:{}", path);ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource resource = resolver.getResource(path);if (resource == null) {throw new RuntimeException("not found template image");}templateImageFile.setImage(ImageIO.read(resource.getInputStream()));String extension = resource.getFilename().substring(resource.getFilename().lastIndexOf(".") + 1);templateImageFile.setInputStream(resource.getInputStream());templateImageFile.setFileExtension(extension);log.info("读取模板图:完成");} catch (Exception e) {log.error(e.getMessage(), e);throw new ServiceException(e.getMessage());}return templateImageFile;}/*** 读取边框图** @param path* @return* @throws ServiceException*/public ImageRead readBorderImageFile(String path) throws ServiceException {ImageRead borderImageFile = null;try {if (borderImageFile != null) {return borderImageFile;}borderImageFile = new ImageRead();log.info("读取边框图:{}", path);ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();Resource resource = resolver.getResource(path);if (resource == null) {throw new RuntimeException("not found template image");}borderImageFile.setImage(ImageIO.read(resource.getInputStream()));String extension = resource.getFilename().substring(resource.getFilename().lastIndexOf(".") + 1);borderImageFile.setInputStream(resource.getInputStream());borderImageFile.setFileExtension(extension);log.info("读取边框图:完成");} catch (Exception e) {log.error(e.getMessage(), e);throw new ServiceException(e.getMessage());}return borderImageFile;}/*** 滑动验证码验证方法** @param x x轴坐标* @param y y轴坐标* @return 滑动验证码验证状态* @throws ServiceException 验证滑动验证码异常*/public Result checkVerificationResult(String x, String y) throws ServiceException {int threshold = 5;try {ImageVerificationVO vo = (ImageVerificationVO) redisService.get(RedisConstants.IMAGE_VERIFICATION + SecurityContextHolder.getUserId());if (vo != null) {if ((Math.abs(Integer.parseInt(x) - vo.getX()) <= threshold) && y.equals(String.valueOf(vo.getY()))) {redisService.delete(RedisConstants.IMAGE_VERIFICATION + SecurityContextHolder.getUserId());return Result.ok();}}} catch (Exception e) {log.error(e.getMessage(), e);throw new ServiceException(e.getMessage());}return Result.fail("图片滑动验证失败");}}

Java图片滑动验证码相关推荐

  1. java验证码图片滑动验证码_图片滑动验证码的生成

    使用Java生成图片滑动验证码 image.png 目前接到了一个新的小需求,要在登录时进行滑动图片验证. 搜了一下网上的demo,没有太多很完整的demo.就参考各种文档自己拼凑了一个出来.整理一下 ...

  2. java实现滑动验证码

    功能:java实现滑动验证码 项目是采用springboot,maven 开发工具:采用idea 1.效果演示: 2.后端代码: 控制层: @Controller public class Slide ...

  3. 滑动验证码 php,图片滑动验证码怎样实现

    这次给大家带来图片滑动验证码怎样实现,图片滑动验证码实现的注意事项有哪些,下面就是实战案例,一起来看一下. 图片滑动验证码,逻辑是根据鼠标滑动轨迹,坐标位置,计算拖动速度等等来判断是否人为操作,当然下 ...

  4. 图片滑动验证码js插件

    图片滑动验证码,逻辑是根据鼠标滑动轨迹,坐标位置,计算拖动速度等等来判断是否人为操作,当然下面的代码只是实现前端部分,只记录了拖动的坐标. 先上代码吧,做个备份记录 jquery.lgymove.js ...

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

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

  6. html 图片滑动验证码,selenium滑动验证码

    selenium验证滑条验证码时一直提示请重新滑动. python+selenium中验证码怎么定位 selenium验证码怎么进行自动化测试 selenium+python怎么模拟用户输入验证码登录 ...

  7. 实现图片滑动验证码js插件+后台(完整版)

    之前一直比较忙,最近也看到之前发的很多人问,现在我就提取出来发个简化完整版的. 我后端采用python+flask+redis,简易实现图片验证功能,如需复杂验证,请记录鼠标拖动轨迹,后端实现分析,具 ...

  8. Java 图片 滑动 解锁

    滑动解锁功能大家都不陌生,类似于如下这种: 公司近期也要求实现类似的功能,百度各种文章,总算实现了一个比较糙的版本,保密等原因就不贴完成图了. 我觉得难点在于滑块图和背景图的处理. 图片处理原理 我粗 ...

  9. Java滑动验证_java图片滑动验证(登录验证)原理与实现方法详解

    本文实例讲述了java图片滑动验证(登录验证)原理与实现方法.分享给大家供大家参考,具体如下: 这是我简单做出的效果图,处理300X150px的校验图,并把图片发到前端,用时50毫秒左右,速度还是非常 ...

最新文章

  1. 超级干货,一文看懂大数据的前世今生
  2. 最好的10个移动 Web 应用程序开发框架
  3. 搜java题的公众号_java搜题公众号
  4. 2.6 Go 读取CSV
  5. Unit Testing in iOS
  6. 【MFC系列2】Win32项目转换为MFC项目
  7. 求有向图中两点最短距离java_Java 迪杰斯特拉算法实现查找最短距离
  8. 4 相机切换_价格屠夫、训练伴侣——海鸟4K运动相机简评
  9. Linux桌面环境GNOME实用技巧
  10. linux怎么安装Nginx
  11. 16种常用统计分析软件介绍
  12. xp系统如何开启ftp服务器,xp系统怎么开ftp服务器
  13. 几何图形经常使用的公式解读(三)
  14. hr面试性格测试30题_HR性格测试题.doc
  15. 男神体 骚包体 快乐体 手拙体 好身体(haha),你知道这些字体的英文名字吗?
  16. 64位程序调用32位dll
  17. 学号java_java ---- 定义一个表示学生的类 包括域“学号”、“班号”、“姓名”、“年龄”;...
  18. php蓝奏云网盘源码,蓝奏云网盘打开目录/上传/下载源码
  19. Python Turtle 画图:黑洞里的繁星(附源代码)
  20. Github项目分享——tabby

热门文章

  1. 基于C++实现植物大战僵尸(控制台版)【100010530】
  2. 小米3解锁移动版(2013061)解账号锁线刷刷机包
  3. 游戏设计自学记录(12)
  4. Python 中删除文件的几种方法 【赶紧收藏】
  5. CF1716 A. 2-3 Moves
  6. DirectX11 演示程序框架
  7. mongoDB安装及启动
  8. W3c phpl基础参考手册-2016-01参考
  9. Pyhton脚本发送信息给微信好友
  10. 「建模学习」Zbrush中凹凸贴图、法线贴图和置换贴图的区别