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

java 复制代码
@Slf4j
public class SignAuthInterceptor implements HandlerInterceptor {
    /**
     * 5分钟有效期
     */
    private final static long MAX_EXPIRE = 5 * 60;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("request URI = " + request.getRequestURI());
        HttpServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper(request);
        //获取全部参数(包括URL和body上的)
        SortedMap<String, String> allParams = HttpUtils.getAllParams(requestWrapper);
        //对参数进行签名验证
        String headerSign = request.getHeader(CommonConstant.X_SIGN);
        String timesTamp = request.getHeader(CommonConstant.X_TIMESTAMP);

        //1.校验时间有消息
        try {
            DateUtils.parseDate(timesTamp, "yyyyMMddHHmmss");
        } catch (Exception e) {
            throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP格式必须为:yyyyMMddHHmmss");
        }
        Long clientTimestamp = Long.parseLong(timesTamp);
        //判断时间戳 timestamp=201808091113
        if ((DateUtils.getCurrentTimestamp() - clientTimestamp) > MAX_EXPIRE) {
            throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP已过期");
        }

        //2.校验签名
        boolean isSigned = SignUtil.verifySign(allParams,headerSign);

        if (isSigned) {
            log.debug("Sign 签名通过!Header Sign : {}",headerSign);
            return true;
        } else {
            log.error("request URI = " + request.getRequestURI());
            log.error("Sign 签名校验失败!Header Sign : {}",headerSign);
            //校验失败返回前端
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/json; charset=utf-8");
            PrintWriter out = response.getWriter();
            Result<?> result = Result.error("Sign签名校验失败!");
            out.print(JSON.toJSON(result));
            return false;
        }
    }

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

Linux 查看当前时间:

bash 复制代码
sudo date

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

bash 复制代码
sudo date -s "10:48:00"

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

bash 复制代码
sudo date -s "0920104823"

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

bash 复制代码
sudo timedatectl set-timezone Asia/Shanghai
相关推荐
我尽力学12 小时前
面试 总结
java·spring boot·面试
爬台阶的蚂蚁12 小时前
Spring AI Alibaba基础概念
java·spring·ai
计算机学姐12 小时前
基于SpringBoot的演唱会抢票系统
java·spring boot·后端·spring·tomcat·intellij-idea·推荐算法
huohuopro12 小时前
Mybatis的七种传参方式
java·开发语言·mybatis
Lee_SmallNorth12 小时前
变态需求之【角色不同访问数据库的用户不同】
java·开发语言·数据库
扶苏-su12 小时前
Java网络编程:InetAddress 详解
java·开发语言·网络
李慕婉学姐12 小时前
Springboot连锁火锅管理及预测系统sh5s1gn1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
Anastasiozzzz13 小时前
leetcode力扣hot100困难题--4.俩个正序数列的中位数
java·算法·leetcode·面试·职场和发展
木风小助理13 小时前
JavaStreamAPI的性能审视,优雅语法背后的隐形成本与优化实践
java·前端·数据库
Chan1613 小时前
《Java并发编程的艺术》| ConcurrentHashMap 在 JDK 1.7 与 1.8 的底层实现
java·spring boot·java-ee·intellij-idea·juc