2020年 3-9 Java实现黑名单摸坑记录

应公司要求 对恶意请求实现黑名单操作 要求 同一ip限定时间内操作10次 便加入黑名单

获取ip代码块


public class IPUtil {
public static String getClientIpWithProxy(HttpServletRequest request) {
String ipAddress = request.getHeader(“X-Real-IP”);

    if (StringUtils.isBlank(ipAddress) || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("x-forwarded-for");
    }
    if (StringUtils.isBlank(ipAddress) || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("Proxy-Client-IP");
    }
    if (StringUtils.isBlank(ipAddress) || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getHeader("WL-Proxy-Client-IP");
    }
    if (StringUtils.isBlank(ipAddress) || "unknown".equalsIgnoreCase(ipAddress)) {
        ipAddress = request.getRemoteAddr();
    }
    if ((ipAddress != null) && (ipAddress.length() > 15) && (ipAddress.indexOf(",") > 0)) {
        ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
    }
    return ipAddress;
}

}

只浅了解到getRemoteAddr()方法是获取request获取ip的方法 判断的相关条件 unknown 还未了解 。各种请求头所处理的任务也未了解 待补充

redisUtil类

//累计

public Long incr(String key, int count, Long time, TimeUnit unit) {
    //add count operation
    Long res = redisTemplate.opsForValue().increment(key, count);//使用 redisTemplate中的修改值方法中以自定义类型为增量的操作
    if (Objects.nonNull(time)) {
        //refresh expire time
        redisTemplate.boundValueOps(key).expire(time, unit);// expire:redis命令 :设定生存时间
    }
    return res;
}

调用:

   RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
    String key = IP_CREATOR.apply(ip);  //  private static Function IP_CREATOR = k ->  "SMS_TIMES:" + k;
    Long times = redisUtil.incr(key, 1, 5L, TimeUnit.MINUTES);
    return times > 5L;

–其中redisTemplate建议阅读 lanbda 有益于代码的快捷实现 建议花时间 熟悉使用
下篇记录lambda学习笔记 及个人观点

你可能感兴趣的:(2020年 3-9 Java实现黑名单摸坑记录)