@
newaccount 我的我的,纯粹想分享下喜悦。这里具体说说吧:就是在 spring gateway 网关中加了一个过滤器,并且把一个多余的过滤器删除掉了。结果远程测试打死都过不了时间校验验证代码:
try {
String value = PuzzleSolver.unPuzzle(x_token);
log.info("解密结果, x_toke = {}, value = {}, userinfo = {}", x_token, value, userInfo);
long time = Long.parseLong(value.substring(0, 13));
long start = System.currentTimeMillis();
difference = start - time; // 计算时间戳差值
log.info("{} time diff {},{},{}",requestId,start,time,difference);
} catch (Exception e) {
log.error("解密请求加密出错, x_toke = {}, userinfo = {} ,err:", x_token, userInfo, e);
throw new BusinessException(ErrorEnum.UNAUTHORIZED);
}
if (difference < 0 || difference > 10000) {
log.error("校验请求时间不合法, x_toke = {}, userinfo = {},difference={}", x_token, userInfo, difference);
throw new BusinessException(ErrorEnum.UNAUTHORIZED);
}
成都团队都没问题,就远程测试存在问题,difference 永远小于 0 ,而且因为是网关会影响其他需求测试,导致只能在快下班的时候和测试复现排查问题,断断续续搞了一周吧。今天直接把删除的代码还原了就可以了,最终定位是在删除的代码里存在:exchange.getResponse().getHeaders().add(HeaderConstant.PAYMENT_TIMESTAMP_KEY, String.valueOf(System.currentTimeMillis()));
前端会根据服务器返回的时间搓进行时间校准。
一开始一直是一位是是添加的 Filter 的顺序导致其时间不对,所以方向一直是在优化 Filter 的执行顺序上。