V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
queifa
V2EX  ›  职场话题

春节前最后一天班,解决了困扰将近一周的问题,开心😄

  •  
  •   queifa · 11 小时 30 分钟前 · 2649 次点击
    第 1 条附言  ·  8 小时 59 分钟前
    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 的执行顺序上。
    第 2 条附言  ·  8 小时 57 分钟前
    远程测试使用的是 window 电脑,成都本地团队配置的是 mac pro
    23 条回复    2026-02-10 22:39:45 +08:00
    wandehul
        1
    wandehul  
       11 小时 24 分钟前   ❤️ 16
    妈的,谁点进来谁傻 b ,来骂一句再走吧。
    zenfsharp
        2
    zenfsharp  
       11 小时 19 分钟前
    羡慕 OP 可以把问题拖一个周。
    换成我这,第二天就得问我解决了没。
    prefect
        3
    prefect  
       11 小时 15 分钟前
    临近下班的时候发现问题没解决,刚思路错了哈哈哈哈
    YuzukiYukari
        4
    YuzukiYukari  
       11 小时 3 分钟前 via Android
    快进到出重大生产事故,大年三十被拉回公司加班
    Ghostsss
        5
    Ghostsss  
       10 小时 55 分钟前
    等后续
    no2cat
        6
    no2cat  
       10 小时 52 分钟前
    做得越多,错的越多。
    L0L
        7
    L0L  
       9 小时 39 分钟前
    我就是那个点进来的傻逼
    eii
        8
    eii  
       9 小时 37 分钟前
    没了吗,再发说说呢?
    newaccount
        9
    newaccount  
       9 小时 29 分钟前
    直说结果不描述问题
    纯标题党!
    画小圈圈诅咒你回家路上接到紧急 bug
    NillSpake
        10
    NillSpake  
       9 小时 25 分钟前
    画小圈圈诅咒你回家路上接到紧急 bug
    unclejoker
        11
    unclejoker  
       9 小时 20 分钟前
    画小圈圈诅咒你回家路上接到紧急 bug
    queifa
        12
    queifa  
    OP
       9 小时 11 分钟前
    @zenfsharp 主要本地和在成都的团队都没问题,就远程的测试有问题。而且只是部署了我的代码有问题,部署 main 分支代码他又没问题了。
    queifa
        13
    queifa  
    OP
       9 小时 0 分钟前
    @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 的执行顺序上。
    queifa
        14
    queifa  
    OP
       8 小时 59 分钟前
    @wandehul 我的我的,纯粹想分享下喜悦。
    newaccount
        15
    newaccount  
       8 小时 28 分钟前
    @queifa #13 所以,前端校准防作弊是一方面
    为啥这个时间会对不上?
    如果只考虑小误差,要不你把 diff 取个 abs 试试?
    queifa
        16
    queifa  
    OP
       8 小时 22 分钟前
    @newaccount window 系统问题吧,前端传过来的时间比服务器上的时间慢了几秒钟。diff 用 abs 按理来说也是可以的,但是领导不同意这种方案呀,可能会存在重放攻击。
    newaccount
        17
    newaccount  
       8 小时 17 分钟前
    @queifa #16 老哥,你这个是前端比服务器时间快了几秒
    从判断上看,如果时间不同步,那么快慢都是有可能的,代码里只检查了慢 10 秒的情况,所以我觉得应该取 abs 把快的情况也加进去,本身你后面的 10 秒检查并没有很好的处理重放
    queifa
        18
    queifa  
    OP
       8 小时 1 分钟前
    @newaccount 是慢吧,当前时间减去某个时间为负数哦。
    long time = Long.parseLong(value.substring(0, 13)); // 前端传的时间搓
    long start = System.currentTimeMillis(); // 服务器时间搓
    difference = start - time; // 计算时间戳差值

    difference < 0 表示服务器时间比前端传递时间快,报错
    difference > 0 表示服务器时间比前端传递时间慢

    0 <= difference <= 10000,允许服务器时间比前端传递时间慢
    newaccount
        19
    newaccount  
       7 小时 54 分钟前
    @queifa #18 有图有真相
    diff < 0 == start - time < 0 == start < time
    ---- start ---- time ---->时间方向
    ---- 服务器时间 ---- 前端时间 ---->时间方向
    服务器比前端慢了 == 前端比服务器快了
    queifa
        20
    queifa  
    OP
       7 小时 38 分钟前
    @newaccount 对的,我搞混了😂
    rainbowGeek
        21
    rainbowGeek  
       6 小时 48 分钟前
    画小圈圈诅咒你回家路上接到紧急 bug
    lowman
        22
    lowman  
       6 小时 5 分钟前   ❤️ 1
    写日记?祝你们公司的服务器大年初一集体宕机。
    frank4liuyang
        23
    frank4liuyang  
       33 分钟前
    画小圈圈诅咒你回家路上接到紧急 bug
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2005 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:13 · PVG 23:13 · LAX 07:13 · JFK 10:13
    ♥ Do have faith in what you're doing.