如何保证订单状态一致性?如何保证接口的幂等性?订单系统保证幂等性?
-
保证幂等性是指保证用户多次重复操作或请求造成的结果是一致的,不会产生任何副作用
1. 幂等实现流程
以订单系统为例,假设用户在付款流程中(此时页面跳转到第三方支付页面),用户在第三方支付成功之后,切换页面回到待付款页面手动关闭订单,此时的订单的状态就出错了,先被更新成已付款状态,后又变更成已关闭,造成了订单状态不一致的现象出现!这种不加任何防护手段的场景,就违背了幂等性的原则
2.代码实现
-
自定义注解
//target表示作用对象,所有类型的方法
-
编写拦截器,处理拦截到的请求
//幂等拦截器
public class MiDengInterceptor implements HandlerInterceptor {
-
在springMVC中配置拦截器
<mvc:interceptor>
<!--拦截的路径所有-->
<mvc:mapping path="/**"/>
<!--不拦共同资源-->
<mvc:exclude-mapping path="/static/**"/>
<!--拦截器的位置-->
<bean class="com.oracle.shop.security.MiDengInterceptor"></bean>
</mvc:interceptor>
-
在需要的方法上添加注解
//取消订单
-
在支付完成后,删除该token,支付完成后的回调页面
//流程执行结束后,删除redis当中的token
redisTemplate.delete("uniqueId"+orders.getId());