整理:https://coding.imooc.com/class/168.html#Envir
如何做到秒杀接口地址的隐藏
在秒杀开始之前,秒杀接口地址不要写到客户端,而是在秒杀开始之后,将秒杀地址动态地在客户端和服务器间进行交互完成拼接。这样一来,秒杀开始之前,秒杀地址对客户端不可见。
实现思路:
-
秒杀开始之前,先去请求接口获取秒杀地址;
-
接口改造,带上
@pathVariable
参数;(MD5(UUID)) -
添加生成地址的接口;
-
秒杀收到请求,先验证
@pathVariable
参数。
注意:但是获取秒杀地址这个接口也有可能被恶意刷,可以使用验证码防刷。
用户在提交获取秒杀地址的请求之前,需要将goodsId和verifyCode一同提交到服务端,服务器通过@RequestParam
参数获取goodsId和verifyCode,然后检验验证码是否正确,如果正确,则返回秒杀地址给客户端,客户端得到秒杀地址后,拼接秒杀地址然后异步地向这个地址发出请求获取秒杀结果,这样就完成了秒杀接口地址的隐藏。
需要注意的是,这里需要将goodsId和verifyCode一同提交到服务端做校验,如果只提交goodsId,那么客户端仍然可以使用明文的方式获取随机生成的接口秒杀地址,但是,引入了verifyCode后,客户端需要将验证码也一起发送到服务端做验证,验证成功才返回随机生成的秒杀地址,不成功则返回非法请求,通过这样一种双重验证的方式,就可以方式用户使用不合理的手段参与秒杀,引入验证码有效地防止了这一点,因为验证码的输入需要用户真正参与进来。
1、goods_detail.htm 商品详情页
修改“立即秒杀”按钮事件(秒杀时间到,才会显示立即秒杀按钮),先获取秒杀地址,再发起秒杀,后面还会加多校验图形验证码。
获取秒杀地址的js 方法,verifyCode验证码是下一节才加的。
获取到秒杀地址后,才往下执行真正的秒杀操作,并把path 拼接
2、新增获取秒杀接口地址
通过uuid 生成,并MD5 加密 (可加一个固定或者随机盐值 salt)
并且设置到redis 缓存,key根据用户id和商品id 生成,所以每个用户获取到的秒杀地址不一样
url: /{path}/do_miaosha
通过路径变量path (MD5加密),区别每个用户的秒杀地址
校验秒杀地址:每个用户的秒杀地址变量path与redis缓存中对比
往期推荐
●日均5亿查询量的京东到家订单中心,为什么舍MySQL用ES?
●四张图带你了解Tomcat系统架构--让面试官颤抖的Tomcat回答系列!
●阿里巴巴为什么能抗住90秒100亿?--服务端高并发分布式架构演进之路
●SpringCloud电商秒杀微服务-Redisson分布式锁方案
一只 有深度 有灵魂 的公众号0.0