分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

(转)秒杀系统中如何动态生成下单随机URL

发布时间:2023-09-06 01:41责任编辑:郭大石关键词:暂无标签

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

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

public class Exposer { ???//加密措施 ???private String md5; ???//其中必要字段,如是否开启秒杀,时间等省}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

获取秒杀URL的conntroller:

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

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; ???}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

用户在获取获取到下单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; ???}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Service 执行秒杀的过程:

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

(转)秒杀系统中如何动态生成下单随机URL

原文地址:https://www.cnblogs.com/panxuejun/p/8427459.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved