WebHandlerAdapter.java 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package com.zanxiang.sdk.adapter;
  2. import com.zanxiang.common.enums.DeviceTypeEnum;
  3. import com.zanxiang.common.enums.HttpStatusEnum;
  4. import com.zanxiang.common.exception.CustomException;
  5. import com.zanxiang.common.utils.StringUtils;
  6. import com.zanxiang.mybatis.entity.GameExt;
  7. import com.zanxiang.sdk.annotation.UnSignCheck;
  8. import com.zanxiang.sdk.service.IGameExtService;
  9. import com.zanxiang.sdk.util.SignUtil;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.apache.logging.log4j.util.Strings;
  12. import org.springframework.stereotype.Component;
  13. import org.springframework.stereotype.Service;
  14. import org.springframework.web.method.HandlerMethod;
  15. import org.springframework.web.servlet.HandlerInterceptor;
  16. import javax.annotation.Resource;
  17. import javax.servlet.http.HttpServletRequest;
  18. import javax.servlet.http.HttpServletResponse;
  19. import java.util.Objects;
  20. /**
  21. * @author : lingfeng
  22. * @time : 2022-09-28
  23. * @description : 拦截器
  24. */
  25. @Component
  26. @Service
  27. @Slf4j
  28. public class WebHandlerAdapter implements HandlerInterceptor {
  29. @Resource
  30. private IGameExtService gameExtService;
  31. @Override
  32. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  33. HandlerMethod handlerMethod = (HandlerMethod) handler;
  34. //排除签名认证接口注解
  35. UnSignCheck unSignCheck = handlerMethod.getMethod().getAnnotation(UnSignCheck.class);
  36. //接口签名验证
  37. if (unSignCheck == null) {
  38. return this.signCheck(request);
  39. }
  40. return Boolean.TRUE;
  41. }
  42. private boolean signCheck(HttpServletRequest request) throws Exception {
  43. //游戏id和密钥
  44. String gameId = request.getHeader("gameId");
  45. String sign = request.getHeader("sign");
  46. String timestamp = request.getHeader("timestamp");
  47. String os = request.getHeader("os");
  48. String deviceType = request.getHeader("deviceType");
  49. //必传参数判断
  50. if (StringUtils.isAnyEmpty(gameId, sign, timestamp, os, deviceType)) {
  51. log.error("非法参数, 请求头中缺少必传参数");
  52. throw new CustomException(HttpStatusEnum.INVALID_PARAMS);
  53. }
  54. //前端类型检测
  55. DeviceTypeEnum deviceTypeEnum = DeviceTypeEnum.getByDeviceType(Integer.valueOf(deviceType));
  56. if (deviceTypeEnum == null) {
  57. throw new CustomException(HttpStatusEnum.INVALID_PARAMS);
  58. }
  59. //签名验证
  60. GameExt gameExt = gameExtService.getByGameAppId(gameId);
  61. if (gameExt == null || Strings.isBlank(gameExt.getAppKey())) {
  62. log.error("非法参数, 游戏id对应的前端密钥appKey不存在");
  63. throw new CustomException(HttpStatusEnum.INVALID_PARAMS);
  64. }
  65. String str = "appKey=" + gameExt.getAppKey() + "&gameId=" + gameId + "&timestamp=" + timestamp;
  66. String mySign = SignUtil.MD5(str);
  67. //签名对比
  68. if (!Objects.equals(mySign, sign)) {
  69. log.error("非法参数, 签名错误, mySign : {}, sign : {}, str : {}", mySign, sign, str);
  70. throw new CustomException(HttpStatusEnum.INVALID_PARAMS);
  71. }
  72. return Boolean.TRUE;
  73. }
  74. }