公共接口限制IP请求次数的一种方式(redis版)

项目中遇到一种情况:前端有一个对外接口,可将用户交互信息保存到数据库,这个接口没有访问限制,有恶意攻击的风险。

采用了限制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);
// 后面跟着逻辑就可以了
// 不管用户请求是否正确,只要请求就记录
// 超过请求次数直接返回,不请求数据库

这只是一个简单的思路,欢迎交流指导,相互学习

posted @ 2020-04-17 10:11  御简  阅读(412)  评论(0编辑  收藏  举报