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

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

  •  
  •   queifa · 16 小时 56 分钟前 · 2778 次点击
    第 1 条附言  ·  14 小时 25 分钟前
    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 条附言  ·  14 小时 23 分钟前
    远程测试使用的是 window 电脑,成都本地团队配置的是 mac pro
    23 条回复    2026-02-10 22:39:45 +08:00
    wandehul
        1
    wandehul  
       16 小时 50 分钟前   ❤️ 16
    妈的,谁点进来谁傻 b ,来骂一句再走吧。
    zenfsharp
        2
    zenfsharp  
       16 小时 45 分钟前
    羡慕 OP 可以把问题拖一个周。
    换成我这,第二天就得问我解决了没。
    prefect
        3
    prefect  
       16 小时 41 分钟前
    临近下班的时候发现问题没解决,刚思路错了哈哈哈哈
    YuzukiYukari
        4
    YuzukiYukari  
       16 小时 28 分钟前 via Android
    快进到出重大生产事故,大年三十被拉回公司加班
    Ghostsss
        5
    Ghostsss  
       16 小时 21 分钟前
    等后续
    no2cat
        6
    no2cat  
       16 小时 18 分钟前
    做得越多,错的越多。
    L0L
        7
    L0L  
       15 小时 5 分钟前
    我就是那个点进来的傻逼
    eii
        8
    eii  
       15 小时 3 分钟前
    没了吗,再发说说呢?
    newaccount
        9
    newaccount  
       14 小时 55 分钟前
    直说结果不描述问题
    纯标题党!
    画小圈圈诅咒你回家路上接到紧急 bug
    NillSpake
        10
    NillSpake  
       14 小时 51 分钟前
    画小圈圈诅咒你回家路上接到紧急 bug
    unclejoker
        11
    unclejoker  
       14 小时 46 分钟前
    画小圈圈诅咒你回家路上接到紧急 bug
    queifa
        12
    queifa  
    OP
       14 小时 37 分钟前
    @zenfsharp 主要本地和在成都的团队都没问题,就远程的测试有问题。而且只是部署了我的代码有问题,部署 main 分支代码他又没问题了。
    queifa
        13
    queifa  
    OP
       14 小时 26 分钟前
    @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
       14 小时 25 分钟前
    @wandehul 我的我的,纯粹想分享下喜悦。
    newaccount
        15
    newaccount  
       13 小时 54 分钟前
    @queifa #13 所以,前端校准防作弊是一方面
    为啥这个时间会对不上?
    如果只考虑小误差,要不你把 diff 取个 abs 试试?
    queifa
        16
    queifa  
    OP
       13 小时 48 分钟前
    @newaccount window 系统问题吧,前端传过来的时间比服务器上的时间慢了几秒钟。diff 用 abs 按理来说也是可以的,但是领导不同意这种方案呀,可能会存在重放攻击。
    newaccount
        17
    newaccount  
       13 小时 43 分钟前
    @queifa #16 老哥,你这个是前端比服务器时间快了几秒
    从判断上看,如果时间不同步,那么快慢都是有可能的,代码里只检查了慢 10 秒的情况,所以我觉得应该取 abs 把快的情况也加进去,本身你后面的 10 秒检查并没有很好的处理重放
    queifa
        18
    queifa  
    OP
       13 小时 27 分钟前
    @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  
       13 小时 20 分钟前
    @queifa #18 有图有真相
    diff < 0 == start - time < 0 == start < time
    ---- start ---- time ---->时间方向
    ---- 服务器时间 ---- 前端时间 ---->时间方向
    服务器比前端慢了 == 前端比服务器快了
    queifa
        20
    queifa  
    OP
       13 小时 4 分钟前
    @newaccount 对的,我搞混了😂
    rainbowGeek
        21
    rainbowGeek  
       12 小时 14 分钟前
    画小圈圈诅咒你回家路上接到紧急 bug
    lowman
        22
    lowman  
       11 小时 31 分钟前   ❤️ 1
    写日记?祝你们公司的服务器大年初一集体宕机。
    frank4liuyang
        23
    frank4liuyang  
       5 小时 59 分钟前
    画小圈圈诅咒你回家路上接到紧急 bug
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   870 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 20:39 · PVG 04:39 · LAX 12:39 · JFK 15:39
    ♥ Do have faith in what you're doing.