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.sdk.annotation.ValidLogin; import com.zanxiang.sdk.domain.dto.UserTokenDTO; import com.zanxiang.sdk.domain.params.UserData; import com.zanxiang.sdk.service.UserTokenService; import com.zanxiang.sdk.util.DeviceCheckUtil; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.util.Strings; 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; @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); } //游戏id String gameId = request.getHeader("gameId"); //是否强制验证登录状态 boolean b = parameter.hasParameterAnnotation(ValidLogin.class); String token = request.getHeader("token"); //需要登录, token不存在 if (b && StringUtils.isEmpty(token)) { throw new CustomException(HttpStatusEnum.USER_NO_LOGIN); } //请求头处理 String userAgent = request.getHeader("user-agent"); Integer deviceType = DeviceCheckUtil.getType(userAgent); UserData data = new UserData(); data.setDeviceType(deviceType); data.setDeviceSystem(DeviceCheckUtil.getDeviceSystem(userAgent)); if (Strings.isNotBlank(gameId)) { data.setGameId(Long.valueOf(gameId)); } //不需要登录, 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()); log.info("UserData:{}", data); return data; } }