如何实现数学公式验证码
这种方式主要是防止客户端通过明文地址+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
注:下一节将介绍图形验证码的校验,上一节介绍了秒杀接口地址的隐藏。
●阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路
●SpringCloud电商秒杀微服务-Redisson分布式锁方案
查看更多好文,进入公众号--撩我--往期精彩
一只 有深度 有灵魂 的公众号0.0