接口限流防刷
防止用户大量重复访问,一分钟之内或几秒钟内限制访问多少次
思路:对接口做限流,计时,并记录访问次数
- 将一个用户的访问次数写到缓存里,同时给数据加有效期,次数增加直接对数据+1
- 如果在有效期内,数据超过某数值,访问返回失败
- 有效期过了,重新存入数据
服务端生成秒杀地址前,先判断用户访问次数
//隐藏秒杀接口地址
@RequestMapping(value="/path", method= RequestMethod.GET)
@ResponseBody
public Result<String> getMiaoshaPath(HttpServletRequest request, MiaoshaUser user,
@RequestParam("goodsId") long goodsId,
@RequestParam(value = "verifyCode") int verifyCode) {
if (user == null) {
return Result.error(CodeMsg.SESSION_ERROR);
}
//限制访问次数
String uri = request.getRequestURI();
String key = uri+"_"+user.getId();
//限定5秒之内只能访问5次
Integer count=redisService.get(AccessKey.access, key, Integer.class);
if(count==null) {
redisService.set(AccessKey.access, key, 1); //缓存有效期5秒
}else if(count<5) {
redisService.incr(AccessKey.access, key);
}else {
//超过5次
return Result.error(CodeMsg.ACCESS_LIMIT_REACHED); //超过访问上限
}
//校验验证码
boolean check = miaoshaService.checkVerifyCode(user, goodsId,verifyCode);
if (!check) {
return Result.error(CodeMsg.REQUEST_ILLIEGAL);
}
//返回访问路径
String path = miaoshaService.createMiaoshaPath(user, goodsId);
return Result.success(path);
}