从构建分布式秒杀系统聊聊验证码

语音识别:PyAudio、SoundDevice、Vosk、openai-whisper、Argos-Translate、FunASR(Python) 本文介绍了Python中常用的音频处理库PyAudio,详细解析了其核心功能、核心概念和典型工作流程。PyAudio是一个跨平台的音频I/O库,支持音频录制、播放、实时流处理和低延迟操作。核心概念包括PyAudio类(管理音频设备和流)和Stream类(代表音频流)。文章重点讲解了open()方法的关键参数、回调函数的使用方式以及典型的工作流程,包括设备查询、流配置和资源释放。PyAudio适用于需要实时音频处理的场景,如语音识别和音频效果处理。 阅读详情

前言

为了拦截大部分请求,秒杀案例前端引入了验证码。淘宝上很多人吐槽,等输入完秒杀活动结束了,对,结束了...... 当然了,验证码的真正作用是,有效拦截刷单操作,让羊毛党空手而归。

验证码

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。

那么到底什么是验证码呢?验证码作为一种人机识别手段,其终极目的,就是区分正常人和机器的操作。我们常见的互联网注册、登录、发帖、领优惠券、投票等等应用场景,都有被机器刷造成各类损失的风险。

目前常见的验证码形式多为图片验证码,即数字、字母、文字、图片物体等形式的传统字符验证码。这类验证码看似简单易操作,但实际用户体验较差(参见12306网站),且随着OCR技术和打码平台的利用,图片比较容易被破解,被破解之后就形同虚设。

这里我们使用腾讯的智能人机安全验证码,告别传统验证码的单点防御,十道安全栅栏打造立体全面的安全验证,将黑产拒之门外。

场景

 

下面我们来瞅瞅验证码轻松解决了那些场景安全问题:

  • 登录注册,为你防护撞库攻击、阻止注册机批量注册
  • 活动秒杀,有效拦截刷单操作,让羊毛党空手而归
  • 点赞发帖,有效解决广告屠版、恶意灌水、刷票问题
  • 数据保护,防止自动机、爬虫盗取网页内容和数据

申请

申请地址:https://007.qq.com/product.html

在线体验:https://007.qq.com/online.html

只要一个QQ就可以免费申请,对于一般的企业OA系统或者个人博客网站,验证码免费套餐足够了已经,具备以下特点:

  • 2000次/小时安全防护
  • 支持免验证+分级验证
  • 三分钟快速接入
  • 全功能配置后台
  • 支持HTTPS
  • 阈值内流量无广告

2000次/小时的安全防护,一般很少达到如此效果,当然了即时超出阈值,顶多也就是多个广告而已。

接入

快读接入:https://007.qq.com/quick-start.html

接入与帮助提供了多种客户端和服务端的接入案例,这里我们使用我们秒杀案例中最熟悉的Java语言来接入。

前端

引入JS:


 
<script src="https://ssl.captcha.qq.com/TCaptcha.js"></script> 

页面元素:


 
<!--点击此元素会自动激活验证码,不一定是button,其他标签也可以--> <!--id : 元素的id(必须)--> <!--data-appid : AppID(必须)--> <!--data-cbfn : 回调函数名(必须)--> <!--data-biz-state : 业务自定义透传参数(可选)--> <button id="TencentCaptcha" data-appid="*********" data-cbfn="callback">验证</button> 

JS回调:


 
<script type="text/javascript"> window.callback = function(res){ console.log(res) // res(未通过验证)= {ret: 1, ticket: null} // res(验证成功) = {ret: 0, ticket: "String", randstr: "String"} if(res.ret === 0){ startSeckill(res) } } //后台验证ticket,并进入秒杀队列 function startSeckill(res){ $.ajax({ url : "startSeckill", type : 'post', data : {'ticket' : res.ticket,'randstr':res.randstr}, success : function(result) { //验证是否通过,提示用户 } }); } </script> 

后端


 
@Api(tags = "秒杀商品") @RestController @RequestMapping("/seckillPage") public class SeckillPageController { @Autowired private ActiveMQSender activeMQSender; //自定义工具类 @Autowired private HttpClient httpClient; //这里自行配置参数 @Value("${qq.captcha.url}") private String url; @Value("${qq.captcha.aid}") private String aid; @Value("${qq.captcha.AppSecretKey}") private String appSecretKey; @RequestMapping("/startSeckill") public Result startSeckill(String ticket,String randstr,HttpServletRequest request) { HttpMethod method =HttpMethod.POST; MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>(); params.add("aid", aid); params.add("AppSecretKey", appSecretKey); params.add("Ticket", ticket); params.add("Randstr", randstr); params.add("UserIP", IPUtils.getIpAddr(request)); String msg = httpClient.client(url,method,params); /** * response: 1:验证成功,0:验证失败,100:AppSecretKey参数校验错误[required] * evil_level:[0,100],恶意等级[optional] * err_msg:验证错误信息[optional] */ //{"response":"1","evil_level":"0","err_msg":"OK"} JSONObject json = JSONObject.parseObject(msg); String response = (String) json.get("response"); if("1".equals(response)){ //进入队列、假数据而已 Destination destination = new ActiveMQQueue("seckill.queue"); activeMQSender.sendChannelMess(destination,1000+";"+1); return Result.ok(); }else{ return Result.error("验证失败"); } } } 

自定义请求工具类 HttpClient:

如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。


 
@Service public class HttpClient { public String client(String url, HttpMethod method, MultiValueMap<String, String> params){ RestTemplate client = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); // 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交 headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers); // 执行HTTP请求 ResponseEntity<String> response = client.exchange(url, HttpMethod.POST, requestEntity, String.class); return response.getBody(); } } 

获取IP地址工具类 IPUtils :


 
/** * IP地址 */ public class IPUtils { private static Logger logger = LoggerFactory.getLogger(IPUtils.class); /** * 获取IP地址 * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址 * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址 */ public static String getIpAddr(HttpServletRequest request) { String ip = null; try { ip = request.getHeader("x-forwarded-for"); if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (StringUtils.isEmpty(ip) || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (StringUtils.isEmpty(ip) || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } } catch (Exception e) { logger.error("IPUtils ERROR ", e); } // 使用代理,则获取第一个IP地址 if (StringUtils.isEmpty(ip) && ip.length() > 15) { if (ip.indexOf(",") > 0) { ip = ip.substring(0, ip.indexOf(",")); } } return ip; } } 

案例效果图

启动项目访问:http://localhost:8080/seckill/1000.shtml

 

 

定制接入

在系统登录的时候,我们需要先校验用户名以及密码,然后调用验证码操作,这里就需要我们定制接入了。


 
<!-- 项目中使用了Vue --> <div class="log_btn" @click="login" >登录</div> login: function () { //这里校验用户名以及密码 // 直接生成一个验证码对象 var captcha = new TencentCaptcha('2001344788', function(res) { if(res.ret === 0){//回调成功 var data = {'username':username,'password':password,'ticket':res.ticket,'randstr':res.randstr} $.ajax({ type: "POST", url: "sys/loginCaptcha", data: data, dataType: "json", success: function(result){ //校验是否成功 } }); } }); captcha.show(); // 显示验证码 }, 

后台监控

腾讯后台还提供了简单实用的数据监控,如下:

 

欢迎工作一到八年的Java工程师朋友们加入Java高级交流:854630135

本群提供免费的学习指导 架构资料 以及免费的解答

不懂得问题都可以在本群提出来 之后还会有直播平台和讲师直接交流噢

有限元分析-静力学分析-与分析解对比-——以阶梯轴的静力分析为例——静态结构分析 150mm,a=300mm{a=300mm}a=300mm,b=200mm{b=200mm}b=200mm,L=1000mm{L=1000mm}L=1000mm,F=300kN{F=300kN}F=300kN,材料为45,弹性模量E=2.1e11Pa{E=2.1e11Pa}E=2.1e11Pa,泊松比v=0.28{v=0.28}v=0.28,屈服应力δs=355MPa{δ_s=355MPa}δ。使用line body生成的模型,可以选择自动划分网格的,WB会将以梁单元将其划分完成,例如图2所示。 阅读详情

相关推荐

EPSON RX8010SJ RTC实战:I2C寄存器配置避坑指南(附完整初始化代码)

本文详细解析了EPSON RX8010SJ RTC芯片在I2C寄存器配置中的常见问题与解决方案,包括TEST位、STOP位和中断控制等关键配置要点。通过实战经验分享和完整的初始化代码模板,帮助开发者避免常见陷阱,确保RTC模块的稳定运行。

weixin_28678831的博客 407

如何完成登录验证(分布式session缓存+验证码)

1. 配置session属性   @Component @ConfigurationProperties(prefix = "gcloud.session") public class Nonprofessional { private Integer maxLoginUser; private Integer maxLoginFail; private Intege...

qq_35261162的博客 3831

硬件基础(4):(7)ADC电压采集:软件校准(标定、拟合)

在实际项目中,**软件端校准**可以有效弥补硬件方面(分压电阻误差、放大器失调、参考源误差等)带来的系统性偏差,从而提高 ADC 测量精度。下面是一个常见的**多点实测校准**流程与思路,个人感觉传感器标定的原理也只这样。

FCZlll的博客 6249

验证码校验的玩法,从单台、集群到分布式

验证码的校验原理其实很简单: 客户端请求验证码; 服务端生成校验码(code_key-code_value),code_key是一次验证码请求和校验的标识(也有称会话id),会返回给客户端;code_value表示正确的验证码(通常以字符串表示);如果是图片这类的验证码,则需要将图片输出到客户端。 用户输入验证码(input_code_value); 客户端会将code_key和输入的验证...

caodongfang126的博客 2312

【2021工业图像异常检测文献】DRÆM: 基于判别性训练的重建嵌入表面异常检测方法

DRÆM – A discriminatively trained reconstruction embedding for surface anomaly detection

qq_1532145264的博客 1478

#Linux内存管理# 用一个案例详细介绍ARMv7-A架构 缺页中断处理的原理

跳转到异常向量:根据 异常向量表基地址(通常配置在 VBAR 寄存器中,例如 0xFFFF0000) + 数据中止异常的偏移量 0x10,跳转到数据中止异常的处理程序入口点 0xFFFF0010(实践中,这个入口通常是一条跳转到更复杂处理函数的指令)。malloc 通常不会立即分配物理内存页,它只是在内核为该进程维护的虚拟地址空间中找到一段足够大的空闲虚拟地址区域(比如 0x00008000 - 0x00008FFF),标记为已用,并返回起始地址(例如 0x00008000)给程序。

sinat_37817094的博客 993

实战:SpringBoot分布式验证码登录方案

本文大纲 文章目录本文大纲前言前后端未分离的验证码登录方案验证码生成流程如下登录验证流程如下前后端分离的验证码登录方案验证码生成流程如下登录验证流程如下动手撸轮子Kaptcha介绍新建项目并加入依赖Redis配置类`RedisConfig`验证码配置类`KaptchaConfig`验证码控制层`CaptchaController`验证码返回对象`CaptchaVO`Redis封装类 `RedisUtils`验证码方法层`CaptchaService`用户登录对象封装`LoginDTO`登录控制层`UserC

快速成长的小菜鸟 1963

【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像

【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像

|~~~热爱生活、努力学习的小伙汁~~~| 1094

Spring Boot实现分布式验证码登录方案

验证码作为一种安全机制,广泛用于验证用户的真实性,防止自动化攻击和滥用服务。在web应用中,验证码能有效防止恶意软件和机器人进行批量操作和暴力破解。在本文中,我们将探讨使用Spring Boot框架实现分布式环境下的验证码登录方案,包括验证码的生成、存储、验证及用户身份验证流程。在现代web开发中,安全性是一个重要的考虑因素。为了防止自动化攻击,如暴力破解、垃圾评论等,许多系统都引入了验证码机制。

2301_76419561的博客 1211

在 SAP Gateway 主机上把 SAML 2.0 配置为 Service Provider:从架构到落地的完整实战

本文详细介绍了在SAP Gateway主机上配置SAML 2.0作为Service Provider的全流程。从概念梳理到实际操作,涵盖了关键步骤:启用本地SP服务、通过反向代理导出元数据、在IdP侧完成对接、配置信任关系与Artifact绑定、设置NameID身份联合等核心环节。特别强调了HTTP Artifact绑定的背道通信机制和证书配置要点,并针对常见错误提供了排障指引。文章注重实操性,结合SAP官方文档与社区最佳实践,为运维团队提供了一套完整的SAML SSO实施框架。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 153

五种雷达波束模式简介及其应用场景

方位角和仰角都很窄的光束(像铅笔一样细);用于三维雷达,如仪表雷达、天气雷达和防空雷达。

珞瑜的博客 3572

SpringBoot 分布式验证码登录方案

???? 这是一个或许对你有用的社群???? 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事上“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

芋艿V 294

ZYNQ BRAM实现PS与PL数据交互

有时CPU需要与PL进行小批量的数据交换,可以通过BRAM模块,也就是Block RAM实现此要求。本章通过Zynq的GP Master接口读写PL端的BRAM,实现与PL的交互。在本实验中加入了自定义的FPGA程序,并利用AXI4总线进行配置,通知其何时读写BRAM。以下为本实验原理图,CPU通过AXI BRAM Controller读取BRAM数据,CPU仅配置自定义的PL BRAM Controller 的寄存器,不通过它读写数据。

baidu_34971492的博客 2283

从构建分布式秒杀系统聊聊验证码 给大家推荐8个SpringBoot精选项目

前言 为了拦截大部分请求,秒杀案例前端引入了验证码。淘宝上很多人吐槽,等输入完秒杀活动结束了,对,结束了...... 当然了,验证码的真正作用是,有效拦截刷单操作,让羊毛党空手而归。 验证码 那么到底什么是验证码呢?验证码作为一种人机识别手段,其终极目的,就是区分正常人和机器的操作。我们常见的互联网注册、登录、发帖、领优惠券、投票等等应用场景,都有被机器刷造成各类损失的风险。 目...

316

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

为什么我总是不能抢买到“秒杀商品”?

来点硬货。抢秒杀商品,你以为电商系统(背后的程序员)会那么轻易让你得逞吗? 每年双十一的秒杀商品,很多人都抱怨抢不到:要么一秒抢完,要么点到付款页面后就疯狂加载,等加载完商品也没了。这时候有些人会动些歪脑筋——让黄牛代抢,有点技术基础的还可以自己自给自足,写个爬虫去抢购。 然鹅!你们能想到的,程序员也能想到。 所以,今天我给大家介绍一下秒杀系统是如何防止恶意刷请求或者爬虫请求。感兴趣的朋友,还可以直接来免费试听我主讲的《秒杀系统项目课》,了解秒杀系统的实现机制。 首先,为了防止恶意刷请求或者爬虫请求,系统会

九章算法的博客 9235

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

阿里P8面试官:聊聊双11百亿流量「高并发秒杀系统」的设计思路

近年来无论是电商还是直播带货等业务,都能看到各种秒杀活动,可以说,秒杀系统几乎是所有互联网公司的标配了。 但是需要明确的是,区别于电商系统这个笼统的架构,秒杀系统具有三个主要特点: 大量用户在同一时间进行抢购,造成瞬时访问量激增 用户请求数量往往远大于库存数量 业务流程简单,涉及到的操作基本就是下单、减库存 所以对应场景特点,秒杀系统就面临着以下问题: 问题1:如何应对瞬时大流量高并发? 拿双十...

九章算法的博客 348

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java最新面试官:聊聊双11百亿流量「高并发秒杀系统」的设计思路(1),java初级面试必问项目技术

每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取。

2401_84584338的博客 852

高并发压测第3小时:精通JVM调优的老炮在秒杀系统崩溃瞬间的挑战

系统OOM的紧急措施应包括:1)保存堆转储(heap dump)分析;:JVM内存模型实际包括堆(年轻代、老年代)、方法区、虚拟机栈、本地方法栈和程序计数器。高并发场景下的JVM调优涉及合理设置内存分代比例、选择适合业务场景的垃圾收集器(如G1、ZGC)、调整线程池参数、优化代码以减少对象创建和GC压力等。还可以把那些大对象都改成static,这样就不用每次都创建新的了,节省内存!Eden区是快消品区,老年代就是仓库...调优嘛,就是把-Xms和-Xmx设置成一样大,系统就能扛住高并发了!

Ared 759

【面试情景剧】大厂面试官灵魂拷问:电商秒杀系统扛不住?谢飞机被问到「回家等通知」

谢飞机:(沉默了10秒)……面试官,我能说「我会先辞职」吗?面试官:(终于忍不住笑了)好吧,这个问题确实有难度。简单说一下思路:用户请求(百万级)↓CDN + 前端静态化(拦截90%)↓网关层限流 + 用户鉴权(拦截8%)↓Redis预扣库存(拦截1.9%)↓Kafka异步下单(仅成功请求进入)↓MySQL落库(最终一致性)每一层尽可能拦截流量,让真正到达数据库的请求降到最低。同时配合服务降级、熔断、灰度发布等容灾手段。谢飞机:(目瞪口呆)面试官,您这不是面试,这是上课啊……面试官。

qq_40346958的博客 288

Java大厂面试实录:Spring Boot + Kafka + Redis 在电商秒杀场景下的应用与避坑指南

能力维度 | 初级程序员 | 高级/资深工程师 || 技术广度 | 知道名词 | 理解生态与选型依据 || 技术深度 | 会用 API | 理解底层原理与边界条件 |

Summerdayxmm的博客 723

大厂Java面试实录:电商秒杀系统架构、微服务分布式事务与JVM性能优化全解析

通过谢飞机面试大厂的真实场景,深入解析电商秒杀系统架构设计、Redis Lua脚本原子操作、Kafka与RabbitMQ选型、微服务熔断降级、Seata分布式事务、慢SQL优化、分库分表及JVM调优等核心技术点,附完整代码示例。

2301_80824309的博客 262

聊聊 微服务 架构中的用户认证方案!

???? 欢迎加入小哈的星球,你将获得:专属的项目实战 /1v1 提问/Java 学习路线 /学习打卡/每月赠书/社群讨论新项目:《从零手撸:仿小红书(微服务架构)》正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...,点击查看项目介绍;《从零手撸:前后端分离博客项目(全栈开发)》2期已完结,演示链接:http...

犬小哈 278
上一篇: SpringBoot 究竟是如何跑起来的?
下一篇: XNginx - nginx 集群可视化管理工具
javaQQ群 866865133
博客等级 码龄8年 59粉丝 309原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值