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

秒杀系统中通常会避免用户之间访问下单页面的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来生成唯一的秒杀URL
    seckillGoodsId为某个商品的唯一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;
      }
      //接口正确,排队执行秒杀操作。减库存+增加购买明细等信息,这里只返回false
      return  true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

redstone618

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值