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

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

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

 

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

如何实现数学公式验证码

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

验证码的作用:

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

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

实现思路:

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

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

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

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

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

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

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

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

一、数学公式验证码生成

1、goods_detail.htm 商品详情

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

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

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

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

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

2、获取验证码js

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

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

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

MiaoshaController

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

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

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

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

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

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

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

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

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

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

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

二、校验

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

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

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

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

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

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

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

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

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

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

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

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

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

史上最强Tomcat8性能优化

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

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

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

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

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

一只 有深度 有灵魂 的公众号0.0高性能Java秒杀系统优化(二)--数学公式验证码

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