自定义参数解析器(HandlerMethodArgumentResolver) 实现用户token解析

在项目中获取用户信息 会被频繁用到,那么怎么可以快速简洁的实现获取当前请求用户信息呢?

可以通过自定义注解实现,详情如下:

1.自定义注解:@Target({ElementType.PARAMETER}) 表明该注解作用于参数上。

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {

    boolean required() default false;
}

2. 自定义解析器实现HandlerMethodArgumentResolver接口,包含两个接口

supportsParameter:用于判定是否需要处理该参数解析,返回true为需要,并会去调用下面的方法resolveArgument。
resolveArgument:用于处理参数分解的方法,返回的Object就是controller方法上的形参对象

public interface HandlerMethodArgumentResolver {
    boolean supportsParameter(MethodParameter parameter);

    @Nullable
    Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}

 

@Component
@Slf4j
public class UserMethodArgumentResolver implements HandlerMethodArgumentResolver {

    @Autowired
    private UserFeignApiService userFeignApiService;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterAnnotation(CurrentUser.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        String token = webRequest.getHeader("token");
        if (parameter.getParameterAnnotation(CurrentUser.class).required()) {
            if (StringUtils.isBlank(token)) {
                throw new IllegalArgumentException("token不能为空");
            }
            return userFeignApiService.getByToken(token);
        }
        if (StringUtils.isNotBlank(token)) {
            return userFeignApiService.getByToken(token);
        }
        return null;
    }
}

3. 自定义方法解析 加入WeMvcConfigurer

@Configuration
public class MvcConfig implements WebMvcConfigurer {

    @Autowired
    private UserMethodArgumentResolver userMethodArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(userMethodArgumentResolver);
        WebMvcConfigurer.super.addArgumentResolvers(resolvers);
    }
}

至此 ,我们就可以在接口参数上通过@CurrentUser 获取用户信息了。

 

posted @ 2022-06-13 14:39  山阴路的秋天  阅读(229)  评论(0编辑  收藏  举报