黑名单优先于白名单,即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.*.*
)。不建议手写正则解析,推荐用成熟工具类:
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
用
Apache Commons Net
的
+
判断 CIDR 是否包含某 IP
对
类型,可转为正则:
,再用
注意:匹配前统一做 IP 标准化(如去除前后空格、处理 IPv4 映射 IPv6 地址)
性能与线程安全的关键细节
网关高频调用,需避免每次请求都查数据库或读文件:
白/黑名单数据建议加载到内存(如
或 Guava
),变更时热刷新
若用 List 存 CIDR 规则,匹配时用
预编译 SubnetUtils 实例列表
,而非每次 new —— 否则 GC 压力大
避免在 if 块中做耗时操作(如远程 HTTP 查询、JDBC 查询),否则拖慢整个请求链路
InetAddressUtils.isIPv4Address()SubnetUtils192.168.*.*"^" + pattern.replace(".", "\.").replace("*", ".*") + "$"ip.matches(regex)ConcurrentHashMapCache