package com.zanxiang.sdk.adapter; import com.zanxiang.common.enums.HttpStatusEnum; import com.zanxiang.common.exception.CustomException; import com.zanxiang.common.utils.StringUtils; import com.zanxiang.module.web.util.IpUtil; import com.zanxiang.mybatis.entity.GameExt; import com.zanxiang.sdk.annotation.ValidLogin; import com.zanxiang.sdk.domain.dto.UserTokenDTO; import com.zanxiang.sdk.domain.params.UserData; import com.zanxiang.sdk.service.GameExtService; import com.zanxiang.sdk.service.UserTokenService; import lombok.extern.slf4j.Slf4j; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; /** * @author : lingfeng * @time : 2022-09-28 * @description : 参数解析器 */ @Component @Service @Slf4j public class ArgumentAdapter implements HandlerMethodArgumentResolver { @Resource private UserTokenService userTokenService; @Resource private GameExtService gameExtService; @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.getParameterType().equals(UserData.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class); if (request == null) { throw new CustomException(HttpStatusEnum.UNKNOWN_ERROR); } //是否强制验证登录状态 boolean b = parameter.hasParameterAnnotation(ValidLogin.class); String token = request.getHeader("token"); //需要登录, token不存在 if (b && StringUtils.isEmpty(token)) { throw new CustomException(HttpStatusEnum.USER_NO_LOGIN); } //设备类型 Integer deviceType = Integer.valueOf(request.getHeader("deviceType")); //前端传过来的是appId,不是真正的gameId GameExt gameExt = gameExtService.getByGameAppId(request.getHeader("gameId")); if (gameExt == null) { throw new CustomException(HttpStatusEnum.UNKNOWN_ERROR); } //构造用户信息 UserData data = UserData.builder() .gameId(gameExt.getGameId()) .ip(IpUtil.getRealIp(request)) .deviceType(deviceType) .deviceSystem(request.getHeader("os")) .mac(request.getHeader("mac")) .imei(request.getHeader("imei")) .androidId(request.getHeader("androidId")) .channel(request.getHeader("channel")) .build(); //不需要登录, token不存在 if (StringUtils.isEmpty(token)) { return data; } UserTokenDTO userTokenDTO = userTokenService.getTokenInfoByTokenDevice(token, deviceType); if (userTokenDTO == null) { if (b) { throw new CustomException(HttpStatusEnum.USER_NO_LOGIN); } return data; } if (b && userTokenDTO.getUserId() == null) { throw new CustomException(HttpStatusEnum.USER_NO_LOGIN); } data.setUserId(userTokenDTO.getUserId()); data.setToken(userTokenDTO.getToken()); data.setExpireTime(userTokenDTO.getExpireTime()); return data; } }