高性能Java秒杀系统优化(二)--数学公式验证码

本文介绍了一种防止秒杀系统被机器人滥用的方法——数学公式验证码。通过生成加减乘除的数学表达式作为验证码,有效分散秒杀请求,减轻服务器压力。文章详细阐述了验证码的生成和校验过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何实现数学公式验证码

这种方式主要是防止客户端通过明文地址+goodsId将秒杀请求不停地发送到服务端,同时,也有效的防止机器人等手段参与秒杀。

验证码的作用:

  • 防止利用机器人等手段防止非目标用户参与秒杀;

  • 减少单位时间内的请求数量。对于一个秒杀商品,在开始秒杀后肯定会有许多用户参与秒杀,那么在开始秒杀的时候,用户请求数量是巨大,从而对服务器产生较大的压力,而通过验证码的方式就可以有效地将集中式的请求分散,从而达到削减请求峰值的目的。

实现思路:

在服务端计算出验证码的表达式的值,存储在服务端,客户端输入验证码的表达式值,传入服务端进行验证。

  • 点击秒杀之前,先让用户输入验证码,分散用户的请求;

  • 添加生成验证码的接口;

  • 在获取秒杀路径的时候,验证验证码;

  • ScriptEngine的使用(用于计算验证码上的表达式)。

当秒杀未开始时,商品详情页异步地向服务端发出获取商品详细信息的请求,同时,获取验证码。服务端收到获取验证码的请求后,生成验证码返回给客户端,同时,将验证码的结果存储再redis中,以便客户端发起秒杀请求时做验证码的校验。

比如:1秒钟进来10万个请求,与10秒钟进来10万个请求,差别很大。

一、数学公式验证码生成

1、goods_detail.htm 商品详情

增加一个图形验证码与输入框元素

点击图形框,刷新验证码图,为防止浏览器缓存,需要在url添加一个时间戳

2、获取验证码js

获取商品详情的ajax ,渲染页面时,有个倒计时判断,在秒杀进行中增加显示验证码,在秒杀结束时隐藏验证码。

3、新增获取图形验证码接口

MiaoshaController

使用 jdk 自带的一个 BufferedImage,使用OutputStream 输出

4、创建图形验证码逻辑,先构建一个图(长、宽、格式),再分别设置颜色、背景等;

再生成一个加减乘除的表达式,并设置到图形中,最后计算表达式的值并设置到redis缓存中。

其中,随机生成一个表达式,如: 5-1*2 ,因为除法可能为0,这里暂不用除法

注:运算符也是从+ - * 中随机取

其中,计算表达式的值(js中也有改方法)

二、校验

获取秒杀地址接口,添加验证码

1、在获取秒杀地址ajax,增加用户输入的计算好的验证码参数,

因为用户点击“立即秒杀”,需要先去获取秒杀地址,才会往下执行真正的秒杀操作。

顺序:验证码 --> 秒杀地址  --> 秒杀  (在获取秒杀地址接口中,校验验证码)

2、获取秒杀地址,校验验证码的值

校验验证码:与redis中的值对比,对比正确,并删除redis中的值

整理:https://coding.imooc.com/class/168.html#Envir

注:下一节将介绍图形验证码的校验,上一节介绍了秒杀接口地址的隐藏。

史上最强Tomcat8性能优化

阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路

B2B电商平台--ChinaPay银联电子支付功能

学会Zookeeper分布式锁,让面试官对你刮目相看

SpringCloud电商秒杀微服务-Redisson分布式锁方案

查看更多好文,进入公众号--撩我--往期精彩

一只 有深度 有灵魂 的公众号0.0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值