接口限流防刷:
限制同一个用户一秒钟或者一分钟之内只能访问固定次数,在服务端对系统做一层保护。
思路:利用缓存实现,用户每次点击之后访问接口的时候,在缓存中生成一个计数器,第一次将这个计数器置1后存入缓存,并给其设定有效期,比如一分钟,一分钟之内再访问,那么数值加一。一分钟之内访问次数超过限定数值,直接返回失败。下一个一分钟,数据重新从0开始计算。因为缓存具有一个有效期,一分钟之后自动失效。
- 获取访问路径
- 拼接用户用户的Id作为一个记录该用户访问次数的key
- 缓存里面取得该key,做判断
如果缓存里面没有取到,代表是第一次访问,所以给缓存设置该key,并设置初始值value为1
如果缓存里面取得值并且小于5,那么直接将该key对应的值value+1
如果缓存里面的次数大于超过4(>=5),那么代表在限制时间内(在缓存还没有失效的时间内),访问次数达到限制
getMiaoshaPath代码:
@RequestMapping(value ="/getPath")
@ResponseBody
public Result<String> getMiaoshaPath(HttpServletRequest request,Model model,MiaoshaUser user,
@RequestParam("goodsId") Long goodsId,
@RequestParam(value="vertifyCode",defaultValue="0") int vertifyCode) {
model.addAttribute("user", user);
//如果用户为空,则返回至登录页面
if(user==null){
return Result.error(CodeMsg.SESSION_ERROR);
}
//限制访问次数
String uri=request.getRequestURI();
String key=uri+"_"+user.getId();
//限定key5s之