• Spring-boot 操作失败,签名验证失败:X-TIMESTAMP已过期


    1. @Slf4j
    2. public class SignAuthInterceptor implements HandlerInterceptor {
    3. /**
    4. * 5分钟有效期
    5. */
    6. private final static long MAX_EXPIRE = 5 * 60;
    7. @Override
    8. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    9. log.info("request URI = " + request.getRequestURI());
    10. HttpServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper(request);
    11. //获取全部参数(包括URL和body上的)
    12. SortedMap allParams = HttpUtils.getAllParams(requestWrapper);
    13. //对参数进行签名验证
    14. String headerSign = request.getHeader(CommonConstant.X_SIGN);
    15. String timesTamp = request.getHeader(CommonConstant.X_TIMESTAMP);
    16. //1.校验时间有消息
    17. try {
    18. DateUtils.parseDate(timesTamp, "yyyyMMddHHmmss");
    19. } catch (Exception e) {
    20. throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP格式必须为:yyyyMMddHHmmss");
    21. }
    22. Long clientTimestamp = Long.parseLong(timesTamp);
    23. //判断时间戳 timestamp=201808091113
    24. if ((DateUtils.getCurrentTimestamp() - clientTimestamp) > MAX_EXPIRE) {
    25. throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP已过期");
    26. }
    27. //2.校验签名
    28. boolean isSigned = SignUtil.verifySign(allParams,headerSign);
    29. if (isSigned) {
    30. log.debug("Sign 签名通过!Header Sign : {}",headerSign);
    31. return true;
    32. } else {
    33. log.error("request URI = " + request.getRequestURI());
    34. log.error("Sign 签名校验失败!Header Sign : {}",headerSign);
    35. //校验失败返回前端
    36. response.setCharacterEncoding("UTF-8");
    37. response.setContentType("application/json; charset=utf-8");
    38. PrintWriter out = response.getWriter();
    39. Result result = Result.error("Sign签名校验失败!");
    40. out.print(JSON.toJSON(result));
    41. return false;
    42. }
    43. }

    拦截器中配置了校验时间,出现这个问题主要原因可能为服务器时间与当前时间出现偏差导致,修改服务器时间即可解决。

    Linux 查看当前时间

    sudo date

    修改系统时间:使用date命令的-s选项来设置系统时间。可以使用24小时制或12小时制,格式为HH:MM:SS或hh:mm:ss。例如,将系统时间设置为10:48:00,可以使用以下命令:

    sudo date -s "10:48:00"

    修改系统日期:使用date命令的-s选项来设置系统日期。日期的格式为MMDDhhmm[[CC]YY][.ss],其中MM为月份,DD为日期,hh为小时,mm为分钟,CC为世纪,YY为年份的后两位,ss为秒数。例如,将系统日期设置为2023年09月20日,可以使用以下命令:

    sudo date -s "0920104823"

    修改系统时区:使用timedatectl命令来设置系统时区。例如,将系统时区设置为北京时间,可以使用以下命令:

    sudo timedatectl set-timezone Asia/Shanghai

  • 相关阅读:
    AI 辅助程序员日常,ES 分页查询 3 分钟搞定!
    可变参数与Collections工具类
    嵌入式Linux系统编程 — 3.7 文件目录与处理
    论文阅读 TEMPORAL GRAPH NETWORKS FOR DEEP LEARNING ON DYNAMIC GRAPHS
    STM32如何使用定时器
    C++ using的三种用法详解
    引入指定字体
    项目从SVN修改成git
    1.7 Elasticsearch分词与内置分词器
    机器学习之集成学习
  • 原文地址:https://blog.csdn.net/qq_40852784/article/details/133069402