bipredicate用于校验物联网设备令牌与ip的合法绑定,通过组合“令牌有效性”和“ip授权范围”两个条件实现简洁、可复用、易测试的断言逻辑。

用 BiPredicate 校验物联网设备身份令牌与 IP 的合法绑定,核心是把“令牌是否有效”和“该令牌是否允许来自当前 IP”这两个判断逻辑组合成一个二元断言,简洁、可复用、易测试。
定义绑定规则的 BiPredicate
你需要一个 BiPredicate<string string></string>,第一个参数是设备令牌(token),第二个是客户端 IP 地址。它返回 true 表示该 token 允许从该 IP 访问。
例如,假设规则是:只有白名单中的 token 才能从指定子网访问:
BiPredicate<string string> isValidBinding = (token, ip) -> {
// 1. 检查 token 是否在已注册设备列表中
if (!registeredTokens.contains(token)) {
return false;
}
// 2. 检查 IP 是否属于该 token 对应的授权子网(简化示例)
String expectedSubnet = tokenToSubnetMap.get(token);
return expectedSubnet != null && ip.startsWith(expectedSubnet);
};</string>
结合真实网络信息做校验
实际接入时,IP 往往来自 HTTP 请求头(如 X-Forwarded-For)或 Netty/Socket 的远程地址,需注意:
- 提取真实客户端 IP 要做代理穿透,避免直接用
request.getRemoteAddr() - IP 字符串可能带端口(如
192.168.1.100:54321),校验前先截取 IPv4/IPv6 主机部分 - 建议用
InetAddress.getByName(ip).isAnyLocalAddress()等辅助判断私有/回环地址
组合多个校验条件(推荐用 and/or)
不要把所有逻辑塞进一个 lambda。拆分成职责清晰的 BiPredicate,再用内置方法组合:
// 基础校验:token 存在且未过期
BiPredicate<string string> hasValidToken = (t, ip) ->
registeredTokens.containsKey(t) && !isExpired(registeredTokens.get(t));
// 网络校验:IP 在设备声明的地理/网络范围内
BiPredicate<string string> ipInAllowedRange = (t, ip) -> {
Device device = registeredTokens.get(t);
return device.getAllowedIps().stream()
.anyMatch(range -> IpRange.contains(range, ip));
};
// 合并:必须同时满足
BiPredicate<string string> finalCheck = hasValidToken.and(ipInAllowedRange);</string></string></string>
在 Spring WebFlux 或 Servlet 中使用
以 Spring Boot 的 Controller 为例,可在拦截前统一校验:
@PostMapping("/data")
public Mono<responseentity>> handleData(
@RequestHeader("Authorization") String authHeader,
@RequestHeader(value = "X-Real-IP", required = false) String clientIp,
ServerWebExchange exchange) {
String token = extractTokenFromAuth(authHeader); // 如 Bearer xxx
String ip = getClientIp(exchange, clientIp);
if (!finalCheck.test(token, ip)) {
return Mono.just(ResponseEntity.status(UNAUTHORIZED).build());
}
return processDeviceData(token, ip);
}</responseentity>
这种写法把绑定逻辑与业务解耦,后续替换为 Redis 实时查表或调用鉴权服务也只需改 BiPredicate 实现。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











