Springboot2通过注解保存当前⽤户信息
背景介绍
在web应⽤中,获取当前访问⽤户是⼤多数接⼝所要处理的事情。如何优雅的获取当前⽤户信息,是许多⼈的兴趣。
根据我的经历,认为通过注解来获取当前⽤户,是⼀个很好的⽅式,简便快捷,封装性⾼。
开始实现
背景就介绍到这⾥,直接上代码:
UserInfo⽤户实体
@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo {
private String name;
private String avatar;
private String introduction;
private List<String> roles;
}
CurrentUser⽤于⽅法中的参数注解
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
UserArgumentResolver负责往注解塞数据的解析器,该类的作⽤是从Request中获取⽤户Token,通过对Token的处理获取⽤户id,再从数据库中拉取⽤户信息,装载到userInfo.java。
这⾥⽤到了Token颁发验证框架jjwt。
@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private JwtOperator jwtOperator;
@Autowired
private UserService userService;
@Override
public boolean supportsParameter(MethodParameter parameter){
return parameter.hasParameterAnnotation(CurrentUser.class);
}
@Override
public UserInfo resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory)throws Exception {        HttpServletRequest request = NativeRequest(HttpServletRequest.class);
String token = Header("X-Token");
Boolean validateToken = jwtOperator.validateToken(token);
if(!validateToken){
throw new AuthenticationException("token 不合法或已过期,请重新登录");
}
Claims claimsFromToken = ClaimsFromToken(token);
Integer userId =(Integer) ("userId");
UserInfo userInfo = UserInfoByUserId(userId.longValue());
return userInfo;
}
}
这⾥还有⼀部,就是将我们写的UserArgumentResolver添加到WebMvcConfig
@Component
public class WebConfig implements WebMvcConfigurer {
@Autowired
private UserArgumentResolver userArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers){
resolvers.add(userArgumentResolver);springboot框架的作用
}
}
验证代码
@GetMapping("/info")
@CheckLogin
public CommonResponse<UserInfo>getUserInfo(@CurrentUser UserInfo userInfo){
return CommonResponse.ok(userInfo);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。