0

在我的应用程序中有很多猜测密码的尝试

public static boolean checkIfAddressBanned(InetSocketAddress from) {
    String address = from.getAddress().getHostAddress();
    if (bannedAddresses.contains(address)) {
        if (loggingEnabled) {
            log.info(String.format("IP [%s] is banned", address));
        }
        return true;
    }
    return false;
}

我正在尝试做的是避免多次调用log.info会降低服务器性能的消息。简单检查布尔标志上方的代码片段是否启用了日志记录。我想重写上面的代码,写跳过一些这样的事件。

跳过某些消息的资源消耗较少的方法是什么?例如,

if (System.currentTimeMillis() % 3 == 0)

另一个例子

if (atomicLong.incrementAndGet % 3 == 0)
4

1 回答 1

0

我不知道您是否可以控制代码定义bannedAddresses,但是这样的东西对您有用吗?

private static Map<String, Integer> bannedAddresses = new HashMap<String, Integer>();
...
public static boolean checkIfAddressBanned(InetSocketAddress from) {
    String address = from.getAddress().getHostAddress();
    Integer attempts = bannedAddresses.get(address);
    if (attempts == null) return false;
    bannedAddresses.put(address, attempts+1);
    if ( (loggingEnabled) && (attempts % 50 == 1) ) {
        log.info(String.format("IP [%s] is banned, %d attempts", address, attempts));
    }
    return true;
}
于 2013-05-27T22:26:42.310 回答