黑名单优先于白名单,即IP若在黑名单中则直接拒绝;其次检查白名单允许访问;最后按默认策略处理。支持CIDR和通配符匹配,需预编译规则并内存缓存以提升性能。
IP 白名单与黑名单的基本逻辑关系
网关做访问控制时,白名单和黑名单不是简单叠加,而是有明确优先级:通常黑名单优先于白名单。也就是说,一个 ip 若同时在黑名单中,即使它也在白名单里,也应拒绝访问。这种“黑名单一票否决”设计更符合安全实践。
基础判断结构:用 if 实现三层校验
核心逻辑可拆解为三步:先查黑名单,再查白名单,最后兜底放行或拦截。代码结构清晰、易维护:
- 第一步(高优):if (ipInBlacklist(ip)) → 直接 return false(拒绝)
- 第二步(次优):else if (ipInWhitelist(ip)) → return true(允许)
- 第三步(默认):else → 根据策略决定:return false(默认拒绝)或 return true(默认放行)
IP 匹配支持 CIDR 和通配符的实用写法
真实场景中,白/黑名单常含网段(如 192.168.1.0/24)或模糊格式(如 10.0.*.*)。不建议手写正则解析,推荐用成熟工具类:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 用 Apache Commons Net 的
InetAddressUtils.isIPv4Address()+SubnetUtils判断 CIDR 是否包含某 IP - 对
192.168.*.*类型,可转为正则:"^" + pattern.replace(".", "\.").replace("*", ".*") + "$",再用ip.matches(regex) - 注意:匹配前统一做 IP 标准化(如去除前后空格、处理 IPv4 映射 IPv6 地址)
性能与线程安全的关键细节
网关高频调用,需避免每次请求都查数据库或读文件:
- 白/黑名单数据建议加载到内存(如
ConcurrentHashMap<string boolean></string>或 GuavaCache),变更时热刷新 - 若用 List 存 CIDR 规则,匹配时用 预编译 SubnetUtils 实例列表,而非每次 new —— 否则 GC 压力大
- 避免在 if 块中做耗时操作(如远程 HTTP 查询、JDBC 查询),否则拖慢整个请求链路

















