1、首先自定义注解(Target指定注解的使用范围,只能用在方法参数上,Retention指定注解的生命周期,Documented表示该注解应该包含在Java文档中)
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TokenToUser {
}
2.自定义方法参数解析器TokenToMallUserMethodArgumentResolver类,需要实现HandlerMethodArgumentResolver接口类,实现该接口里的两个方法:supportsParameter和resolveArgument。
@Component
public class TokenToMallUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private MallUserMapper mallUserMapper;
@Autowired
private NewBeeMallUserTokenMapper newBeeMallUserTokenMapper;
public TokenToMallUserMethodArgumentResolver() {
}
public boolean supportsParameter(MethodParameter parameter) {
if (parameter.hasParameterAnnotation(TokenToUser.class)) {
return true;
}
return false;
}
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
if (parameter.getParameterAnnotation(TokenToMallUser.class) instanceof TokenToMallUser) {
MallUser mallUser = null;
//获取请求头中的header
String token = webRequest.getHeader("token");
//判断token是否存在
if (null != token && !"".equals(token) && token.length() == Constants.TOKEN_LENGTH) {
//查找token表后,判断该token是否合法
MallUserToken mallUserToken = newBeeMallUserTokenMapper.selectByToken(token);
if (mallUserToken == null || mallUserToken.getExpireTime().getTime() <= System.currentTimeMillis()) {
NewBeeMallException.fail(ServiceResultEnum.TOKEN_EXPIRE_ERROR.getResult());
}
mallUser = mallUserMapper.selectByPrimaryKey(mallUserToken.getUserId());
//用户不存在
if (mallUser == null) {
NewBeeMallException.fail(ServiceResultEnum.USER_NULL_ERROR.getResult());
}
//用户是否被封
if (mallUser.getLockedFlag().intValue() == 1) {
NewBeeMallException.fail(ServiceResultEnum.LOGIN_USER_LOCKED_ERROR.getResult());
}
//返回用户对象,供方法使用
return mallUser;
} else {
NewBeeMallException.fail(ServiceResultEnum.NOT_LOGIN_ERROR.getResult());
}
}
return null;
}
}
SupportsParameter方法:用于判断解析器是否支持解析给定的方法参数(这里判断参数是否有@TokenToUser的注解)
ResolveArgument方法:读取请求的参数、header、cookie等信息,进行自定义的解析逻辑,最终返回解析后的参数给被注解的方法参数。
3.定义配置类WebMvcConfigurer,在其中配置TokenToMallUserMethodArgumentResolver并使其生效
@Configuration
public class NeeBeeMallWebMvcConfigurer extends WebMvcConfigurationSupport {
@Autowired
private TokenToMallUserMethodArgumentResolver tokenToMallUserMethodArgumentResolver;
/**
* @param argumentResolvers
* @tip @TokenToUser 注解处理方法
*/
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(tokenToMallUserMethodArgumentResolver);
}
}
4.最后在需要处理的参数加上@TokenToMall注解
public String test(@TokenToMallUser MallUser loginMallUser)