一篇文章让你了解如何优雅地处理重复请求

对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。

重复的场景有可能是:

黑客拦截了请求,重放前端/客户端因为某些原因请求重复发送了,或者用户在很短的时间内重复点击了网关重发….

本文讨论的是如何在服务端优雅地统一处理这种情况,如何禁止用户重复点击等客户端操作不在本文的讨论范畴。

利用唯一请求编号去重

可能会想到的是,只要请求有唯一的请求编号,那么就能借用Redis做这个去重——只要这个唯一请求编号在redis存在,证明处理过,那么就认为是重复的

代码大概如下:

String KEY = "REQ12343456788";//请求唯一编号

long expireTime = 1000;// 1000毫秒过期,1000ms内的重复请求会认为重复

long expireAt = System.currentTimeMillis() expireTime;

String val = "expireAt@" expireAt;

//redis key还存在的话要就认为请求是重复的

Boolean firstSet = stringRedisTemplate.execute((RedisCallback) connection -

THE END
Copyright © 2024 亿华云