| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 | package org.jeecg.config.sign.interceptor;import java.io.PrintWriter;import java.util.SortedMap;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.jeecg.common.api.vo.Result;import org.jeecg.common.constant.CommonConstant;import org.jeecg.common.util.DateUtils;import org.jeecg.config.sign.util.BodyReaderHttpServletRequestWrapper;import org.jeecg.config.sign.util.HttpUtils;import org.jeecg.config.sign.util.SignUtil;import org.springframework.web.servlet.HandlerInterceptor;import com.alibaba.fastjson.JSON;import lombok.extern.slf4j.Slf4j;/** * 签名拦截器 * @author qinfeng */@Slf4jpublic 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;        }    }}
 |