跳到主要内容

接口防刷

使用@AccessLimit注解,标注在接口上即可,亦可标注在controller类上。

注解参数:

参数类型默认值说明
secondint1秒数区间(second秒内最多访问maxCount次)
maxCountint1访问次数上限(second秒内最多访问maxCount次)
strategyKeyStrategySYSTEM缓存限制策略(定义限制主体)

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": "请求过快,休息会吧!"
}