写在前面
在项目开发过程中,难免都要获取当前登录用户的信息。通常的做法,都是开发一个获取用户信息的接口。
如果在本项目中,多处都需要获取登录用户的信息,难不成还要调用自己写的接口吗?显然不用!
以往的项目经验里,都是使用用户对应的Service获取,今天使用自定义注解对其进行数据绑定,从而获取登录用户信息。
步骤一:编写自定义注解
先自定义一个用于绑定登录用户信息的注解,且运行时有效。
代码如下:
/**
* 当前登录用户信息注解
*/
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CurrentUser{
}
步骤二:自定义UserResolver
Spring boot封装了SpringMVC中的HandlerMethodArgumentResolver接口,自定义UserResolver要实现对应的2个接口。
代码如下:
/**
* 当前登录用户Resolver
*/
public class CurrentUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private UserService userService;
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
//判断方法参数是否带有@CurrentUser注解且参数类型为User或其子类
return methodParameter.hasParameterAnnotation(CurrentUser.class) && User.class.isAssignableFrom(methodParameter.getParameterType());
}
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
//获取当前登录用户
return userService.getCurrent();
}
}
步骤三:WebMvcConfig配置自定义解析器
新建一个webconfig 实现 WebMvcConfigurer 接口, 需要重写 addArgumentResolvers 这个方法,初始化我们创建的操作类。
代码如下:
/**
* 配置自定义解析器
*/
@Configuration
public class MvcConfig implements WebMvcConfigurer{
@Bean
public CurrentUserMethodArgumentResolver currentUserMethodArgumentResolver() {
return new CurrentUserMethodArgumentResolver();
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(currentUserMethodArgumentResolver());
}
}
步骤四:编写代码测试
@RequestMapping(value = "/getUser", method = RequestMethod.GET)
public Map<String, Object> queryUser( @CurrentUser UserInfoVO userInfo) {
System.out.println(userInfo);
}
小结
之所以能够自定义注解获取当前登录用户信息,就是借助于HandlerMethodArgumentResolver来扩展自己的参数解析器。
在resolveArgument接口中编写对应获取登录用户信息的逻辑代码。举个栗子,有的系统是从数据库中获取数据,有的则把对应数据放在redis中。所以在这里从不同地方获取即可。
The end.