接口防刷
使用@AccessLimit
注解,标注在接口上即可,亦可标注在controller
类上。
注解参数:
参数 | 类型 | 默认值 | 说明 |
---|---|---|---|
second | int | 1 | 秒数区间(second秒内最多访问maxCount次) |
maxCount | int | 1 | 访问次数上限(second秒内最多访问maxCount次) |
strategy | KeyStrategy | SYSTEM | 缓存限制策略(定义限制主体) |
KeyStrategy
枚举说明:
SYSTEM
(默认):限制系统访问
IP
:限制同ip
SESSION_ID
:限制同sessionId访问(理解为限制一个浏览器)
USER_ID
:限制同用户id(需实现IPlugInMethodService.getUserId()
方法接口)
栗子:
-
定义
IPlugInMethodService.getUserId()
的具体实现。如果需要使用
USER_ID
策略时是必要的,若非,则无需实现此方法。(推荐实现,以便今后拓展使用)
@Service
public class PlugInMethodServiceImpl implements IPlugInMethodService {
// 其他方法...
/**
* 获取用户id(返回String)
* @return 用户id
*/
@Override
public String getUserId() {
return Objects.requireNonNull(ServletUtil.getUserId()).toString();
}
}
-
定义web接口
@AccessLimit
注解可作用于类上,也可作用于接口上,若同时占有,则以接口为准。
@RestController
@RequestMapping("demo")
@AccessLimit(second = 5,maxCount = 2,strategy = AccessLimit.KeyStrategy.USER_ID)
public class DemoController {
@GetMapping("accessLimitTest")
@AccessLimit(second = 5,maxCount = 2,strategy = AccessLimit.KeyStrategy.USER_ID)// 该注解亦可用于类上。
public Result accessLimitTest(){
return R.OK();
}
}
- 结果
此时可多次访问
/demo/accessLimitTest
,当访问过阈值时,返回结果:
{
"code": 429,
"message": "请求过快,休息会吧!"
}