版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Weixiaohuai/article/details/85092182
一、简介
上篇文章主要介绍了注解的概念以及怎么自定义一些注解,本文将通过SpringBoot中实现获取当前登录用户的自定义注解示例,进一步熟悉自定义注解的实际应用场景。
二、实现思路
【a】定义用户实体类User:
public class User implements Serializable {
private String loginId;
private String name;
public User(String loginId, String name) {
this.loginId = loginId;
this.name = name;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
【b】自定义注解CurrentLoginUser:
/**
* @Description: 当前登录用户自定义注解
* @Auther: weishihuai
* @Date: 2018/12/19 10:32
* 说明: 在web端controller接口中,可以通过注入该注解,获取到当前登录的用户信息
*/
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CurrentLoginUser {
String value() default "";
}
【c】自定义参数解析器:
/**
* @Description: @CurrentLoginUser注解解析器
* @Auther: weishihuai
* @Date: 2018/12/19 10:36
* 说明: 自定义参数解析器
*/
public class CurrentLoginUserMethodArgumentResolver implements HandlerMethodArgumentResolver {
public CurrentLoginUserMethodArgumentResolver() {
}
/**
* 用于判定是否需要处理该参数分解,返回true为需要,并会去调用下面的方法resolveArgument.
*
* @param methodParameter 方法参数
* @return
*/
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
//如果方法参数上面有@CurrentLoginUser注解,返回true,并且执行下面的resolveArgument()解析参数的方法,如果不存在该注解返回false,不会执行resolveArgument()方法
return methodParameter.hasParameterAnnotation(CurrentLoginUser.class);
}
/**
* 真正用于处理参数分解的方法,返回的Object就是controller方法上的形参对象.
*
* @param methodParameter 方法参数
* @param modelAndViewContainer
* @param nativeWebRequest
* @param webDataBinderFactory
* @return 自定义注解参数的值
* @throws Exception
*/
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
// 获取当前登录的用户信息(可以同时返回登录用户所有的权限或者角色信息)
// Object principal = SecurityUtils.getSubject().getPrincipal();
// if (null != principal && principal instanceof RbacUserInfoProtocol){
// return principal;
// }
//获取当前登录用户的逻辑处理
//这里只是模拟简单的返回当前登录用户
return new User("admin", "zhangsan");
}
}
【d】 配置自定义参数解析器
/**
* @Description: 配置自定义参数解析器
* @Auther: weishihuai
* @Date: 2018/12/19 10:52
*/
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public CurrentLoginUserMethodArgumentResolver currentLoginUserMethodArgumentResolver() {
return new CurrentLoginUserMethodArgumentResolver();
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
//添加@CurrentLoginUser方法注解的解析处理
argumentResolvers.add(currentLoginUserMethodArgumentResolver());
super.addArgumentResolvers(argumentResolvers);
}
}
【e】测试
@RequestMapping("/testLoginUser")
public void testLoginUser(@CurrentLoginUser User user) {
System.out.println("TestController.testLoginUser-->loginId-->" + user.getLoginId() + "-->name-->" + user.getName());
}
启动项目:
如图,可以看到,当前登录用户的值都注入到@CurrentLoginUser注解中了,可以在Controller中注解拿出当前登录用户的信息,避免频繁调用获取当前用户信息的方法,比较简便。
三、总结
以上就是关于在SpringBoot中使用自定义注解获取当前登录用户的示例,仅供大家学习参考,希望对大家的学习有所帮助。