秒杀系统中通常会避免用户之间访问下单页面的URL(避免使用爬虫来造成不公平)。所有需要将URL动态化,即使秒杀系统的开发人员也无法在知晓在秒杀开始时的URL。解决办法是在获取秒杀URL的接口中,返回一个服务器端生成的随机数,并在下单URL中传递该参数完成下单。

首先构造一个获取下单URL的modle

public class Exposer {//加密措施private String md5;//其中必要字段,如是否开启秒杀,时间等省
}

获取秒杀URL的conntroller:

   @RequestMapping(value = "/{goodsId}/getUrl")public Exposer exposer(@PathVariable("goodsId") Long seckillGoodsId){//goodsId表示是什么商品,然后根据该商品的数据库依次获得尚未被秒杀的每个商品的唯一ID,然后根据商品的唯一ID来生成唯一的秒杀URLseckillGoodsId为某个商品的唯一id
其中这一步可以省,之间将goodsId表示的传递给exportSeckillUrl也可以完成//异常判断省掉,返回上述的model对象。即包含md5的对象Exposer result =seckillService.exportSeckillUrl(seckillGoodsId);return result;}

Service的方法实现:

  //加入一个混淆字符串(秒杀接口)的salt,为了我避免用户猜出我们的md5值,值任意给,越复杂越好
private final String salt="12sadasadsafafsafs。/。,";public Exposer exportSeckillUrl(long seckillGoodsId) {//首页根据该seckillGoodsId判断商品是否还存在。//如果不存在则表示已经被秒杀String md5 = getMD5(seckillGoodsId);return  new Exposer(md5);
}private String getMD5(long seckillGoodsId){//结合秒杀的商品id与混淆字符串生成通过md5加密String base=seckillGoodsId+"/"+salt;String md5= DigestUtils.md5DigestAsHex(base.getBytes());return md5;}

用户在获取获取到下单URL的时候,当秒杀开启后则会得到一个md5值。通过该md5值来完成下单具体的秒杀交易:

具体执行秒杀操作的接口

 @RequestMapping(value = "/{seckillGoodsId}/{md5}/execution")public Boolean execution(@PathVariable("seckillGoodsId") Long seckillGoodsId,@PathVariable("md5") String md5){Boolean result = seckillService.executionSeckillId(seckillId,md5);//executionSeckillId的操作是强事务,操作为减库存+增加购买明细,最终返回是否秒杀成功,秒杀成功的商品消息等。这里省,只返回是否接口合理的信息。return  result;}

Service 执行秒杀的过程:

 public Boolean executionSeckillId(long seckillID,String md5){if(md5==null||!md5.equals(getMD5(seckillID))){//表示接口错误,不会执行秒杀操作return false;}//接口正确,排队执行秒杀操作。减库存+增加购买明细等信息,这里只返回falsereturn  true;}
}

秒杀系统中如何动态生成下单随机URL相关推荐

  1. Linux系统中的“动态库”和“静态库”

    Linux系统中的"动态库"和"静态库" 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable a ...

  2. python动态映射_Python Django框架url反向解析实现动态生成对应的url链接示例

    本文实例讲述了Python Django框架url反向解析实现动态生成对应的url链接.分享给大家供大家参考,具体如下: url反向解析:根据url路由规则,动态生成对应的url链接 (防止硬编码). ...

  3. 简单秒杀系统中的redis限时抢购

    为什么要限时? 上一篇文章介绍了如何在大数据量用户的请求下对请求数量做限制,也就是接口限流.在实际的秒杀中,除了要考虑接口限流外,还要考虑即使用户通过了令牌桶算法的限流,但是也可能在要秒杀商品的时候( ...

  4. Linux系统中的动态库和静态库

    来源:  wjlkoorey258 链接:  http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库 ...

  5. 一篇文章告诉你如何在报表系统中实现自动生成Word报告

    点击获取ActiveReports v14.0最新版下载 在报表系统中,生成Word报告的常见步骤分为以下四步:采集原始数据.值后台传递.生成最终报告模板.实现打印和预览.可见,系统在生成报告之前,需 ...

  6. 关于电商秒杀系统中防超卖、以及高性能下单的处理方案简述

    秒杀抢购系统的成功平稳运行,有一些需要注意的知识点. 1 高并发,以及刷接口等黑客请求对服务端的负载冲击 2 高并发时带来的超卖,即商品数量的控制 3 高负载下,下单的速度和成功率的保证 4 其他 以 ...

  7. java 消息队列 秒杀_【IDEA+SpringBoot+Java商城秒杀实战21】高并发秒杀系统接口优化 RabbitMQ异步下单...

    问题: 针对秒杀的业务场景,在大并发下,仅仅依靠页面缓存.对象缓存或者页面静态化等还是远远不够.数据库压力还是很大,所以需要异步下单,如果业务执行时间比较长,那么异步是最好的解决办法,但会带来一些额外 ...

  8. c++中如何动态生成变量名

    这个问题也困扰了我好久,要是真的去动态的生成x0,x1,x2........是真的不可能. 但是会有办法做到相似效果. 比如想要做到如下: for(int i = 0; i < _vector. ...

  9. 关于电商秒杀系统中防超卖处理方案简述,统统给你解决!

    一.Spring Boot 相关 (1)SpringBoot 面试专题 什么是 Spring Boot? Spring Boot 有哪些优点? 什么是 JavaConfig? 如何重新加载 Sprin ...

最新文章

  1. PCIe知识学习 (转载)
  2. 见与不见 ---仓央嘉措
  3. ntfs分配单元大小怎么选_星月菩提尺寸大小怎么选
  4. firedebug调试Jquery
  5. 技术分享 | 业务模板的技术实践
  6. Win11怎么设置提高电脑游戏性能
  7. 网页中调用Google地图
  8. python二维数组初始化_如何在Python中初始化二维数组?
  9. 全局配置_再次强调:必须站在全局的角度去考虑客厅的内机配置
  10. cad插件_CAD插件坐标标注安装教程
  11. alter index
  12. 和数研究院4周年庆,初心不改,笃行致远!
  13. 15.IGame游戏公司的故事
  14. C语言,指针变量的*p,p以及p的区别
  15. JavaWeb学习-案例练习-图书管理后台-5- 完成图书删除功能
  16. unity webgl打包 苹果12以上机型打开连接后模型黑屏卡帧问题
  17. mac上配置cordova开发Android平台APP环境
  18. 仔细体验,我想从产品设计的角度分析分析微信的声音锁
  19. 变换矩阵在二维图形中的应用
  20. 两种简单的方法Docker构建LANMP

热门文章

  1. Python启动器(py.exe)主版本次版本相同补丁版本不同解释器选择的异常问题
  2. Unity3d C#利用材质(Material)贴图的偏移实现2D游戏单背景图无限移动背景效果功能(含源码)
  3. Filter进行登录验证时循环重定向的解决方法
  4. 宝藏又小众的西方立绘文字游戏素材网站分享
  5. 如何正确对待鱼刺卡喉?
  6. 鱼刺类_多线程应用v5.4.3 例程+模块
  7. 离婚3年以后发现有离婚时尚未分割的夫妻共同财产
  8. 杭州市商用密码应用协会领导一行莅临世平信息参观交流
  9. 封神台 第四章:进击!拿到Web最高权限(绕过防护上传木马)
  10. oracle到神通,我的ORACLE笔记(三)