为什么要开细节类
因为有很多东西,很细微,但又很实用。就会放在细节类。该类的目的是做个记录,既然简单。
限制ip接口案例
场景
需要针对相同ip用户每分访问接口次数的做限制,防止用户恶意刷。
代码
1 | /** |
解析
情景
假设每分钟限制8次请求
代码逻辑是否符合需求
上面的代码案例并不是完全依照每分钟限制8次请求逻辑处理,因为有重置过期时间。
假设第6,7,8次请求都间隔了40s。按逻辑,第6次和第8次中间间隔了80s,超过一分钟了,但因为访问接口,未超过限制次数时会重置过期时间为60s的因素,第6次访问和第8次访问被累加在同一个次数累计中。
代码合理性
从合理性上,我觉得是合理的。但逻辑解释应该是相同ip距离上一次访问时间不超过一分钟,计入次数累计,当次数累计超过限制次数将会返回错误,时间1min
当然,如果要按目前逻辑实现也很简单,可以存储值num_day(累计次数+当天日期(最小单位:天)),然后重置的时间设置为当前时间戳-第一次的时间戳。
优化点
首先ip这块用户可以通过vpn等手段切换不同ip。
其次,限制次数是设置在cookie用户是可以删除的。
建议:限制用户每天可以请求多少次,记录在redis之类的服务端缓存。
限制用户每天可以请求多少次
检验
1 | // 邀请邮件 校验: 每天(utc时区)限制50封 |
累计次数
1 | $this->setApiRequestLimitByDay('bizInviteEmail', $accountId); //发送邮件后更新用户当天发邮件次数 |
方法
1 | /** |








