ArgumentAdapter.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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.sdk.annotation.ValidLogin;
  6. import com.zanxiang.sdk.domain.dto.UserTokenDTO;
  7. import com.zanxiang.sdk.domain.params.UserData;
  8. import com.zanxiang.sdk.service.UserTokenService;
  9. import com.zanxiang.sdk.util.DeviceCheckUtil;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.apache.logging.log4j.util.Strings;
  12. import org.springframework.core.MethodParameter;
  13. import org.springframework.stereotype.Component;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.web.bind.support.WebDataBinderFactory;
  16. import org.springframework.web.context.request.NativeWebRequest;
  17. import org.springframework.web.method.support.HandlerMethodArgumentResolver;
  18. import org.springframework.web.method.support.ModelAndViewContainer;
  19. import javax.annotation.Resource;
  20. import javax.servlet.http.HttpServletRequest;
  21. /**
  22. * @author : lingfeng
  23. * @time : 2022-09-28
  24. * @description : 参数解析器
  25. */
  26. @Component
  27. @Service
  28. @Slf4j
  29. public class ArgumentAdapter implements HandlerMethodArgumentResolver {
  30. @Resource
  31. private UserTokenService userTokenService;
  32. @Override
  33. public boolean supportsParameter(MethodParameter parameter) {
  34. return parameter.getParameterType().equals(UserData.class);
  35. }
  36. @Override
  37. public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
  38. HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
  39. if (request == null) {
  40. throw new CustomException(HttpStatusEnum.UNKNOWN_ERROR);
  41. }
  42. //游戏id
  43. String gameId = request.getHeader("gameId");
  44. //是否强制验证登录状态
  45. boolean b = parameter.hasParameterAnnotation(ValidLogin.class);
  46. String token = request.getHeader("token");
  47. //需要登录, token不存在
  48. if (b && StringUtils.isEmpty(token)) {
  49. throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
  50. }
  51. //请求头处理
  52. String userAgent = request.getHeader("user-agent");
  53. Integer deviceType = DeviceCheckUtil.getType(userAgent);
  54. UserData data = new UserData();
  55. data.setDeviceType(deviceType);
  56. data.setDeviceSystem(DeviceCheckUtil.getDeviceSystem(userAgent));
  57. if (Strings.isNotBlank(gameId)) {
  58. data.setGameId(Long.valueOf(gameId));
  59. }
  60. //不需要登录, token不存在
  61. if (StringUtils.isEmpty(token)) {
  62. return data;
  63. }
  64. UserTokenDTO userTokenDTO = userTokenService.getTokenInfoByTokenDevice(token, deviceType);
  65. if (userTokenDTO == null) {
  66. if (b) {
  67. throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
  68. }
  69. return data;
  70. }
  71. if (b && userTokenDTO.getUserId() == null) {
  72. throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
  73. }
  74. data.setUserId(userTokenDTO.getUserId());
  75. log.info("UserData:{}", data);
  76. return data;
  77. }
  78. }