问题的发现和原因:
我维护的一款 app 最近出现了一个问题,经过我寻找问题后,发现这么一个现象。
有时候用户用的 WiFi 的延迟特别高,以至于延迟超出了我设定网络请求的超时时间。
此时,app 会显示网络问题,提示用户再次点击按钮发送网络请求,然后用户也确实按照提示再次点击了按钮。
然后由于网络神奇的延迟,服务器很短时间内收到了两个包 。因为这个请求很重要,所以服务器对这个请求做了防包重放攻击的措施,对于第二个包直接返回错误。
然后我写 app 的时候,完全没有想到弱网络情况下会导致“人为的重放攻击”。所以我对于这个错误的处理就比较激进。
后来用户使用 app 的时候发生了上述的情况,我才发现这里存在问题。
目前使用的解决方法:
知道了问题的原因,解决起来就有方向了。
在服务器端:
对这个包的请求做hash,对于相同的请求包,只响应第一个请求,后续的相同请求不响应。
保存所有的请求包的 hash 成本很高,我觉得保存最近 5-10min 的hash就行了。
在移动端:
发送重要请求前先向服务器发一个无关紧要的请求“探探路”。要是请求正常,下一步发送重要请求。否则,请用户更换网络环境再重试。
以上这两个解决方法是我根据我正在维护的 app 的现状脑洞出来的。
第二种是我目前正在使用的。
当然啦,这个问题还是在设计阶段就考虑到比较好。等发现了问题再修补就很难受了。
欢迎交流~