braum源码分析(五)-braum核心BraumProcessor
开始
本篇分析braum的核心process处理流程。这里实现在BraumShieldProcessor里面。
缓存的3种key
正常key,通过调用formatKey生成。
限制key,在正常key的基础上,增加braum_前缀。
黑名单key,在正常key的基础上,增加braum_blacklist_前缀。
限制访问的条件判断(三个条件)
- 是否要长期禁止,长期禁止的条件是拉黑次数大于定义的faultTolerance。
这里要注意,如果faultTolerance=-1,则不进行长期禁止。
boolean isBlockingAccess = (properties.getFaultTolerance() != -1 && (blocklistCount = this.getBlacklistCount(key)) > properties.getFaultTolerance());if (isBlockingAccess) {return new BraumResponse().isError().setMsg("Access has been restricted!").setExpire(-1).setLimitCount(blocklistCount).setAccessInfo(request);}
- 是否被短期限制,通过判断缓存是否存在当前ip生成的lockKey
if (cache.hasKey(lockKey)) {blocklistCount = this.getBlacklistCount(key);long expire = cache.getExpire(lockKey);String msg = String.format(lockMsgTpl, ip, blocklistCount, expire);log.debug(msg);return new BraumResponse().isError().setMsg(msg).setExpire(expire).setLimitCount(blocklistCount).setAccessInfo(request);}
- 是否需要限制,先累加访问次数,在isLimitedAccess里面累加,比较隐蔽,我当时也是找了很久。如果超过阈值,先加入一次黑名单,然后再以lockKey作为缓存存储。
这边感觉有点漏洞,如果faultTolerance=-1,其实黑名单是不生效的,这边先判断下faultTolerance再确定是否要加入黑名单比较严谨一些。
if (isLimitedAccess(key)) {this.save2Blacklist(key);cache.set(lockKey, 1, properties.getLimitedTime(), TimeUnit.MILLISECONDS);long expire = cache.getExpire(lockKey);blocklistCount = this.getBlacklistCount(key);String msg = String.format(lockMsgTpl, ip, blocklistCount, expire);return new BraumResponse().isError().setMsg(msg).setExpire(expire).setLimitCount(blocklistCount).setAccessInfo(request);}
- 正常访问通过
String msg = String.format(accessMsgTpl, ip, properties.getInterval(), cache.get(key).getValue());return new BraumResponse().isSuccess().setMsg(msg).setAccessInfo(request);
这里的三个条件顺序能否改变?
明显不行的,首先判断是否被长期限制,然后判断是否已经被限制,最后判断是否需要限制。
其他
更多源码分析,关注我学源码网www.darkberrynet.com
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
