域名备案号查询时,如果对一个完整的域名(例如:`cdn.jiangsu.chinatax.gov.cn`)无法直接获取备案信息,会将其拆分为子域名列表进行逐级查询。例如: - 原始域名:`cdn.jiangsu.chinatax.gov.cn` - 切割后的子域名列表:`["jiangsu.chinatax.gov.cn", "chinatax.gov.cn"]` 通过对这些子域名一次性全部查询备案信息,得到一个备案信息映射: ``` { "chinatax.gov.cn": "true_京ICP备13021685号-2", "jiangsu.chinatax.gov.cn": "true_苏ICP备05002258号-2" } ``` 最后为原始域名(`cdn.jiangsu.chinatax.gov.cn`)确定一个最终的备案号。 逻辑是遍历子域名列表,根据子域名在备案信息映射中是否存在,选取对应的备案号。代码逻辑如下: ```java subDomainMap.forEach((key, subs) -> subs.forEach(sub -> { if (domainsICP.containsKey(sub)) { result.put(key, domainsICP.get(sub)); } })); ``` 这里 `subDomainMap` 存储的是原始域名和其对应的子域名列表的映射,例如 `{ "cdn.jiangsu.chinatax.gov.cn": ["jiangsu.chinatax.gov.cn", "chinatax.gov.cn"] }`,`domainsICP` 是备案信息映射,`result` 用于存储最终的备案号结果。 代码逻辑中,子域名列表 `["jiangsu.chinatax.gov.cn", "chinatax.gov.cn"]` 是按照从长到短的顺序遍历的。由于 `result.put(key, value)` 会覆盖之前的值,最终结果总是会被列表中最后一个匹配到的子域名的备案号覆盖。 - 第一次循环,`sub` 为 `jiangsu.chinatax.gov.cn`,找到备案号 `true_苏ICP备05002258号-2`,存储到 `result` 中。 - 第二次循环,`sub` 为 `chinatax.gov.cn`,也找到备案号 `true_京ICP备13021685号-2`,会覆盖掉之前的值。 - 同理如果 `chinatax.gov.cn` 为 `false` 那么最终 `cdn.jiangsu.chinatax.gov.cn` 也会被覆盖为未备案(false)。