SpringBoot如何实现接口幂等性操作?( 二 )


第三种、利用Token防止重复提交
针对前后端分离项目 , 在客户端连续进行点击按钮或者是调用超时的时候 , 利用Token就可以有效的防止重复提交 。
简单的说就是在调用方调用接口的时候先向后端请求了一个全局的TokenID , 在请求的时候携带这个Token进行调用 。后端需要根据这个Token作为key , 用户信息作为value到缓存中去验证 , 如果存在对应的数据则执行删除操作 , 然后后续的逻辑正常执行 , 如果没有找到或者是找到的数据不匹配那么就无法执行后续的操作 。有点像是令牌 , 这个令牌的获取也可以进行流控操作 。通过令牌的多少来控制发到后端请求的数量 , 这样也可以有效的减轻后端系统的压力 。如下图所示

SpringBoot如何实现接口幂等性操作?

文章插图
 
 
  1. 服务端提供获取Token的接口 , 这个Token可以是一个序列号也可以是一个分布式ID也可以其他唯一标识的字符串
  2. 客户端调用获取Token接口 , 这个时候服务端会生成一个Token串 。
  3. 然后将该字符串存储到redis缓存中 , 并且对这个Token串设置一个过期时间
  4. 将Token返回到客户端 , 客户端将Token携带到请求头部
  5. 客户端执行表单提交操作 , 并且将头部的Token一起发到服务端
  6. 服务端获取到头部的Token之后 , 根据Token从Redis缓存中查找对应的信息 。判断是否存在 。
  7. 如果服务端判断到对应Key存在并且信息匹配 , 那么就删除对应的key之后执行后续的业务 , 如果不存在则抛出异常提示重复提交异常 。
 
注意 , 在并发场景中 , 执行Redis操作需要保证操作的原子性 , 这个时候有可能因为多个线程的进入而无法保证幂等性操作 , 这个是时候就需要采用分布式锁机制来保证原子性操作 。
第四种、唯一标识匹配
通过上面的分析 , 要想保证幂等性操作 , 其实主要就是要让后续的操作逻辑能够正常执行 , 那么这个时候 , 我们只需要保证每次请求都可以被唯一标识就可以保证是否重复提交 。这个时候我们可以为每一个请求分配一个唯一的标识 , 这个标识是一个短期标识 。并且一般由下游的服务来生成 , 这个时候就保证了当上游服务请求发到下游服务的时候两者都知道对应的请求是否发生了变化 。如下图所示 。
SpringBoot如何实现接口幂等性操作?

文章插图
 
上面这个操作有点类似于Token获取操作的思路 。可以参照Token方式来对其进行理解 。
【SpringBoot如何实现接口幂等性操作?】总结
上面我们介绍了接口幂等性操作 , 并且介绍了保证幂等性的几种方式 。当然上述的这些内容在单体应用的情况下基本上不会出现问题 , 但是如果在并发场景下一定要结合锁机制来使用才能有效的保证数据的安全性 。




推荐阅读