96SEO 2026-02-19 17:47 29
之前项目需要在验证码模块增加滑动验证码用来给手机端使用的大概看了下主要方法就是将图片切割然后记住偏移量进行滑动前端验证的时候需要用前端传入的偏移量和生成的偏移量进行对比如果在阈值之内就验证通过否则就不通过。

具体实现方式见下文。
之前没时间写最近记录一下。
本工程主要依赖springboot框架并且需要redis存验证码的信息还需要几个图片用来生成验证码。
com.thcb.captchademo.captcha.domain;import
com.thcb.captchademo.captcha.domain;import
com.thcb.captchademo.captcha.utils;import
com.thcb.captchademo.captcha.utils;import
com.thcb.captchademo.captcha.domain.Captcha;import
https://loyer.wang/view/ftp/wallpaper/%s.jpg;/***
{captcha.setCanvasWidth(320);}//设置画布高度默认值if
{captcha.setCanvasHeight(155);}//设置阻塞块宽度默认值if
{captcha.setBlockWidth(65);}//设置阻塞块高度默认值if
{captcha.setBlockHeight(55);}//设置阻塞块凹凸半径默认值if
{captcha.setBlockRadius(9);}//设置图片来源默认值if
ImageIO.read(url.openStream());}//获取本地图片else
{System.out.println(获取拼图资源失败);//异常处理return
bufferedImage.getScaledInstance(width,
Image.SCALE_SMOOTH);BufferedImage
BufferedImage.TYPE_INT_ARGB);Graphics2D
resultImage.createGraphics();graphics2D.drawImage(image,
null);graphics2D.dispose();return
BufferedImage.TYPE_4BYTE_ABGR);//阻塞块的轮廓图int[][]
Color.BLACK.getRGB());blockImage.setRGB(i,
j));//轮廓设置为白色取带像素和无像素的界点判断该点是不是临界轮廓点if
Color.WHITE.getRGB());waterImage.setRGB(i,
Color.WHITE.getRGB());}}//这里把背景设为透明else
Color.TRANSLUCENT);waterImage.setRGB(i,
(ArrayIndexOutOfBoundsException
{//防止数组下标越界异常}}}//在画布上添加阻塞块水印addBlockWatermark(canvasImage,
int[blockWidth][blockHeight];double
(x-a)²(y-b)²r²,标识圆心a,b,半径为r的圆//计算需要的小图轮廓用二维数组来表示二维数组有两张值0和1其中0表示没有颜色1有颜色for
Objects.requireNonNull(circle1)[0],
Objects.requireNonNull(circle2)[0],
addBlockWatermark(BufferedImage
canvasImage.createGraphics();graphics2D.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
0.8f));graphics2D.drawImage(blockImage,
null);graphics2D.dispose();}/***
ByteArrayOutputStream();ImageIO.write(bufferedImage,
Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());return
String.format(data:image/%s;base64,%s,
{System.out.println(图片资源转换BASE64失败);//异常处理return
service层封装了工具类的一些方法这里为了简单没写接口正常应该是service和impl两个类。
com.thcb.captchademo.captcha.service;import
com.thcb.captchademo.captcha.domain.Captcha;
com.thcb.captchademo.captcha.utils.CaptchaUtils;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.data.redis.core.StringRedisTemplate;
org.springframework.data.redis.core.ValueOperations;
org.springframework.stereotype.Service;import
java.util.concurrent.TimeUnit;/***
stringRedisTemplate.opsForValue();String
(Math.abs(Integer.parseInt(text)
验证成功删除redis缓存stringRedisTemplate.delete(key);return
stringRedisTemplate.opsForValue();ops.set(imageCode:
获取验证码拼图生成的抠图和带抠图阴影的大图及抠图坐标**/public
{//参数校验CaptchaUtils.checkCaptcha(captcha);//获取画布的宽高int
captcha.getCanvasHeight();//获取阻塞块的宽高/半径int
captcha.getBlockRadius();//获取资源图BufferedImage
CaptchaUtils.getBufferedImage(captcha.getPlace());//调整原图到指定大小canvasImage
CaptchaUtils.imageResize(canvasImage,
CaptchaUtils.getNonceByRange(blockWidth,
CaptchaUtils.getNonceByRange(10,
BufferedImage.TYPE_4BYTE_ABGR);//新建的图像根据轮廓图颜色赋值源图生成遮罩CaptchaUtils.cutByTemplate(canvasImage,
UUID.randomUUID().toString().replaceAll(-,
String.valueOf(blockX));//设置返回参数captcha.setNonceStr(nonceStr);captcha.setBlockY(blockY);captcha.setBlockSrc(CaptchaUtils.toBase64(blockImage,
png));captcha.setCanvasSrc(CaptchaUtils.toBase64(canvasImage,
controller层有两个方法一个是获取验证码的方法一个是验证码校验的方法。
com.thcb.captchademo.captcha.controller;import
com.thcb.captchademo.captcha.domain.Captcha;
com.thcb.captchademo.captcha.domain.LoginVo;
com.thcb.captchademo.captcha.service.CaptchaService;
com.thcb.captchademo.captcha.utils.AjaxResult;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.web.bind.annotation.PostMapping;
org.springframework.web.bind.annotation.RequestBody;
org.springframework.web.bind.annotation.RequestMapping;
org.springframework.web.bind.annotation.RestController;/***
captchaService;PostMapping(/slideCaptchaImage)public
AjaxResult.success(captchaService.getCaptcha(new
captchaService.checkImageCode(loginVo.getNonceStr(),
工程不算复杂源码上传到GitCode项目地址上传有点问题而且目前只能设置成私密项目等之后可以调整的时候再改成公开的。
滑动验证码功能不算复杂可以和项目当前已有的验证码共存调用不同的接口返回不同类型的验证码当然这个就根据项目具体情况确定了。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback