ArgumentAdapter.java 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package com.zanxiang.sdk.adapter;
  2. import com.zanxiang.common.enums.HttpStatusEnum;
  3. import com.zanxiang.common.exception.CustomException;
  4. import com.zanxiang.common.utils.StringUtils;
  5. import com.zanxiang.module.web.util.IpUtil;
  6. import com.zanxiang.mybatis.entity.GameExt;
  7. import com.zanxiang.sdk.annotation.ValidLogin;
  8. import com.zanxiang.sdk.domain.dto.UserTokenDTO;
  9. import com.zanxiang.sdk.domain.params.UserData;
  10. import com.zanxiang.sdk.service.GameExtService;
  11. import com.zanxiang.sdk.service.UserTokenService;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.core.MethodParameter;
  14. import org.springframework.stereotype.Component;
  15. import org.springframework.stereotype.Service;
  16. import org.springframework.web.bind.support.WebDataBinderFactory;
  17. import org.springframework.web.context.request.NativeWebRequest;
  18. import org.springframework.web.method.support.HandlerMethodArgumentResolver;
  19. import org.springframework.web.method.support.ModelAndViewContainer;
  20. import javax.annotation.Resource;
  21. import javax.servlet.http.HttpServletRequest;
  22. /**
  23. * @author : lingfeng
  24. * @time : 2022-09-28
  25. * @description : 参数解析器
  26. */
  27. @Component
  28. @Service
  29. @Slf4j
  30. public class ArgumentAdapter implements HandlerMethodArgumentResolver {
  31. @Resource
  32. private UserTokenService userTokenService;
  33. @Resource
  34. private GameExtService gameExtService;
  35. @Override
  36. public boolean supportsParameter(MethodParameter parameter) {
  37. return parameter.getParameterType().equals(UserData.class);
  38. }
  39. @Override
  40. public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
  41. HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
  42. if (request == null) {
  43. throw new CustomException(HttpStatusEnum.UNKNOWN_ERROR);
  44. }
  45. //是否强制验证登录状态
  46. boolean b = parameter.hasParameterAnnotation(ValidLogin.class);
  47. String token = request.getHeader("token");
  48. //需要登录, token不存在
  49. if (b && StringUtils.isEmpty(token)) {
  50. throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
  51. }
  52. //设备类型
  53. Integer deviceType = Integer.valueOf(request.getHeader("deviceType"));
  54. //前端传过来的是appId,不是真正的gameId
  55. GameExt gameExt = gameExtService.getByGameAppId(request.getHeader("gameId"));
  56. if (gameExt == null) {
  57. throw new CustomException(HttpStatusEnum.UNKNOWN_ERROR);
  58. }
  59. //构造用户信息
  60. UserData data = UserData.builder()
  61. .gameId(gameExt.getGameId())
  62. .ip(IpUtil.getRealIp(request))
  63. .deviceType(deviceType)
  64. .deviceSystem(request.getHeader("os"))
  65. .mac(request.getHeader("mac"))
  66. .imei(request.getHeader("imei"))
  67. .androidId(request.getHeader("androidId"))
  68. .channel(request.getHeader("channel"))
  69. .build();
  70. //不需要登录, token不存在
  71. if (StringUtils.isEmpty(token)) {
  72. return data;
  73. }
  74. UserTokenDTO userTokenDTO = userTokenService.getTokenInfoByTokenDevice(token, deviceType);
  75. if (userTokenDTO == null) {
  76. if (b) {
  77. throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
  78. }
  79. return data;
  80. }
  81. if (b && userTokenDTO.getUserId() == null) {
  82. throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
  83. }
  84. data.setUserId(userTokenDTO.getUserId());
  85. data.setToken(userTokenDTO.getToken());
  86. data.setExpireTime(userTokenDTO.getExpireTime());
  87. return data;
  88. }
  89. }