简介
一个接口,被请求一次或被请求多次,效果是一样的,那这个接口就是幂等的,像查询、删除这些就是幂等的。项目中,防止重复下单,防止重复支付,还有防止消息重复消费,这些都是借口幂等的,可以使用令牌机制解决。
模拟场景---购物车下单
第一步:
在页面初始化时(也就是刚进入页面),向后台请求获取一个uuid的值。
而后台在生产uuid后,同时也要把生产的uuid存入redis中(也可以放入数据库,存入redis缓存较好)
第二步:
前台点击下单按钮时,将表单里的属性加上个uuid属性,并将页面初始化时获取的uuid赋值给表单里的uuid
表单参数:
请求后台方法前先将其orderForm里的uuid赋值
第三步:
后台接到表单对象,做出处理
后台接到表单对象后判断里面的uuid是否存在于redis里,存在先是删除uuid这个键key,然后再做下单的业务处理等,最后返回响应;如果不存在,则是重复了。
举例:
如果用户一次性连续点击多次按钮,也是发起多次请求,每次请求里带的参数uuid都是同一个(页面初始化获得的uuid),那我第一次请求在处理时已经把redis存的键给删了,那么后面的请求就进不去if()判断里面,执行不了下单的业务。
总结:
令牌机制也就是后台生成一个UUID存储到redis里也可以存入数据库,前台拿到uuid再赋值给表单里的uuid,在做业务时拿出表单对象里的UUID判断,第一次下单成功直接接删除redis缓存里的uuid,不给连续第二次第三次机会走下单业务。