JeecgBoot
JeecgBoot copied to clipboard
签名拦截器 SignAuthInterceptor, 时间戳判断BUG
版本号:3.6.1
问题描述:签名拦截器 SignAuthInterceptor, 整点之间可能会出现时间戳判断超时
如传参时间戳:20240828115959, 校验时 20240828120000 , 两者差是4041,值远大于300,就会返回签名已失败
错误截图:
友情提示:
- 未按格式要求发帖、描述过于简单的,会被直接删掉;
- 描述问题请图文并茂,方便我们理解并快速定位问题;
- 如果使用的不是master,请说明你使用的分支;
解决: //转成时间判断 Date date = DateUtils.str2Date(xTimestamp, DateUtils.yyyymmddhhmmss.get()); if (date == null || Math.abs(DateUtils.dateDiff('s', new Date(), date)) > MAX_EXPIRE) { log.error("签名验证失败:X-TIMESTAMP已过期,注意系统时间和服务器时间是否有误差!"); throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP已过期"); }
public static int dateDiff(char flag, Date startTime, Date endTime) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(startTime);
c2.setTime(endTime);
long millisDiff = getMillis(c1) - getMillis(c2);
int diff;
switch (flag) {
case 'y':
diff = c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR);
break;
case 'M':
diff = (c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR)) * 12 + c1.get(Calendar.MONTH) - c2.get(Calendar.MONTH);
break;
case 'd':
diff = (int) (millisDiff / DAY_IN_MILLIS);
break;
case 'h':
diff = (int) (millisDiff / HOUR_IN_MILLIS);
break;
case 'm':
diff = (int) (millisDiff / MINUTE_IN_MILLIS);
break;
case 's':
diff = (int) (millisDiff / SECOND_IN_MILLIS);
break;
default:
diff = 0;
break;
}
return diff;
}
你可以改最大校验值,说明前端和后端服务器误差较大