当前位置:
网络安全 > 【第206期】面试官:你们的项目如何处理重复请求/并发请求?
【第206期】面试官:你们的项目如何处理重复请求/并发请求?
2022年5月17日下午4:00
•
面试问题 •
阅读 15
点击上方“Java面试题精选”,关注公众号
面试时画图,查漏补缺
>>例外:公众号改版后,文章顺序不固定。欢迎您将我们的面试题选公众号设为星星。感谢您一年来的支持! !
阶段总结合集:一年内容,200道Java面试题阶段总结
对于某些用户请求,在某些情况下可能会重复发送。如果是查询操作的话倒也没什么大不了的,但是有些涉及到写操作。一旦重复,可能会导致交易等严重后果。如果重复请求该接口,可能会导致重复下单。
重复出现的场景可能是:
黑客拦截了请求并重放了它
前端/客户端由于某种原因重复发送请求,或者用户短时间内重复点击。
网关重传
……
本文讨论如何在服务器端优雅、统一地处理这种情况。如何禁止用户重复点击等客户端操作超出了本文的讨论范围。
使用唯一请求号进行重复数据删除
你可能会想到的是,只要请求有唯一的请求号,就可以使用Redis来做这个去重——只要redis中存在唯一的请求号,并且证明它已经被处理过,那么就认为是重复的。
代码大致如下:
String userId= "12345678";//用户String method = "pay";//接口名称 String dedupMD5 = new ReqDedupHelper().dedupParamMD5(req,"requestTime");//计算请求参数汇总,不包括请求时间干扰字符串KEY = "dedup:U=" + userId + "M=" + method + "P=" + dedupMD5;
长过期时间 = 1000; // 1000毫秒过期,1000ms内重复请求将被视为重复 long expireAt = System.currentTimeMillis() + expireTime;String val = "expireAt@" + expireAt;// 注意:直接SETNX不支持过期时间,因此设置+过期不是原子操作。极端情况下,设置后可能不会过期。后续相同的请求可能会误认为需要去重,所以这里使用了底层API来保证 SETNX+ 过期时间是一个原子操作 Boolean firstSet = stringRedisTemplate.execute((RedisCallback) connection -> connection.set( KEY.getBytes()、val.getBytes()、Expiration.milliseconds(expireTime)、RedisStringCommands.SetOption.SET_IF_ABSENT) );
最终布尔 isConsiderDup;if (firstSet != null && firstSet) { isConsiderDup = false;} else { isConsiderDup = true;}
结尾
来源:www.sychzs.cn/blog/2020/05/19/handle-duplicate-request
推荐十期
【第191期】面试官:您能谈谈SOA架构和微服务架构的区别吗?
【第192期】面试官:线程池中多余的线程如何回收?
【第193期】如何使用装饰器模式在不改变原有对象的情况下扩展功能
[第194期] Redis - 我们应该如何执行非第三方jar封装的命令?
【第195期】MySQL中可以使用条件判断函数CASE WHEN、IF、IFNULL吗?
【第196期】打好基础,Java8新特性Stream详细教程
【第197期】华为OD两轮技术面试记录,供后人参考!
【第198期】面试官:你能告诉我方法重载和方法重写的原理吗?
【第199期】100%使用的hashCode()和equals()方法及使用规范你掌握了吗?
【第200期】面试官:您能简单讲一下SpringMVC的实现原理吗?
而不是在网上搜索问题?还不赶快关注我们吧~版权声明:本文内容由网友自愿贡献,本文所表达的观点仅代表作者自己的观点。本网站仅提供信息存储空间服务,不拥有任何所有权,也不承担相关法律责任。如果您发现本站有任何涉嫌侵权/非法内容,请发送邮件举报。一经核实,该网站将立即删除。
本文由斑马博客整理。本文链接为:https://www.sychzs.cn/index.php/post/7683.html