项目中遇到一种情况:前端有一个对外接口,可将用户交互信息保存到数据库,这个接口没有访问限制,有恶意攻击的风险。
采用了限制IP请求次数的方式,示例如下:
// 通过HttpServletRequest获取ip地址 String ip = request.getRemoteAddr(); // 制定redis的key String key = "USER_IP:" + ip; // 获取key对应的value Object hmCount = redisTemplate.opsForValue().get(key); // 存在就判断是否大于10次 if (hmCount != null) { int count = Integer.parseInt(hmCount.toString()); if (count >= 10) { return message.error200(); } // 不存在就添加一个,设置有效期为1天 } else { redisTemplate.opsForValue().set(key, 0); redisTemplate.expire(key, 60 * 60 * 24L, TimeUnit.SECONDS); } // 计数加1 redisTemplate.opsForValue().increment(key, 1);
// 后面跟着逻辑就可以了
// 不管用户请求是否正确,只要请求就记录
// 超过请求次数直接返回,不请求数据库
这只是一个简单的思路,欢迎交流指导,相互学习
原文:https://www.cnblogs.com/SamNicole1809/p/12718033.html