1952ed0726b8149066ae73ae3fd4692a8b0ebe9c.svn-base 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package org.jeecg.config.sign.interceptor;
  2. import java.io.PrintWriter;
  3. import java.util.SortedMap;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import org.jeecg.common.api.vo.Result;
  7. import org.jeecg.common.constant.CommonConstant;
  8. import org.jeecg.common.util.DateUtils;
  9. import org.jeecg.config.sign.util.BodyReaderHttpServletRequestWrapper;
  10. import org.jeecg.config.sign.util.HttpUtils;
  11. import org.jeecg.config.sign.util.SignUtil;
  12. import org.springframework.web.servlet.HandlerInterceptor;
  13. import com.alibaba.fastjson.JSON;
  14. import lombok.extern.slf4j.Slf4j;
  15. /**
  16. * 签名拦截器
  17. * @author qinfeng
  18. */
  19. @Slf4j
  20. public class SignAuthInterceptor implements HandlerInterceptor {
  21. /**
  22. * 5分钟有效期
  23. */
  24. private final static long MAX_EXPIRE = 5 * 60;
  25. @Override
  26. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  27. log.info("request URI = " + request.getRequestURI());
  28. HttpServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper(request);
  29. //获取全部参数(包括URL和body上的)
  30. SortedMap<String, String> allParams = HttpUtils.getAllParams(requestWrapper);
  31. //对参数进行签名验证
  32. String headerSign = request.getHeader(CommonConstant.X_SIGN);
  33. String timesTamp = request.getHeader(CommonConstant.X_TIMESTAMP);
  34. //1.校验时间有消息
  35. try {
  36. DateUtils.parseDate(timesTamp, "yyyyMMddHHmmss");
  37. } catch (Exception e) {
  38. throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP格式必须为:yyyyMMddHHmmss");
  39. }
  40. Long clientTimestamp = Long.parseLong(timesTamp);
  41. //判断时间戳 timestamp=201808091113
  42. if ((DateUtils.getCurrentTimestamp() - clientTimestamp) > MAX_EXPIRE) {
  43. throw new IllegalArgumentException("签名验证失败:X-TIMESTAMP已过期");
  44. }
  45. //2.校验签名
  46. boolean isSigned = SignUtil.verifySign(allParams,headerSign);
  47. if (isSigned) {
  48. log.debug("Sign 签名通过!Header Sign : {}",headerSign);
  49. return true;
  50. } else {
  51. log.error("request URI = " + request.getRequestURI());
  52. log.error("Sign 签名校验失败!Header Sign : {}",headerSign);
  53. //校验失败返回前端
  54. response.setCharacterEncoding("UTF-8");
  55. response.setContentType("application/json; charset=utf-8");
  56. PrintWriter out = response.getWriter();
  57. Result<?> result = Result.error("Sign签名校验失败!");
  58. out.print(JSON.toJSON(result));
  59. return false;
  60. }
  61. }
  62. }