@Slf4j
public class SignAuthInterceptor implements HandlerInterceptor {/*** 5分钟有效期*/private final static long MAX_EXPIRE = 5 * 60;@Overridepublic 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=201808091113if ((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 查看当前时间:
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