SpringBoot通过参数注解自动获取当前用户信息的方法
作者:写程序的小熊猫
这篇文章主要介绍了SpringBoot通过参数注解自动获取当前用户信息的方法,文中使用HandlerMethodArgumentResolver 类来实现这个功能,并通过代码示例讲解的非常详细,需要的朋友可以参考下
需求:通过注解实现自动获取当前用户信息
思路:使用HandlerMethodArgumentResolver 类来实现这个功能;
这个接口有两个方法,supportsParameter和resolveArgument。
- 方法supportsParameter返回值是boolean类型,它的作用是判断Controller层中的参数,是否满足条件,满足条件则执行resolveArgument方法,不满足则跳过。
- resolveArgument方法,它只有在supportsParameter方法返回true的情况下才会被调用。用于处理一些业务,将返回值赋值给Controller层中的这个参数。
执行流程
1.请求 ->
2.拦截器(获取当前用户并放在UserContext中)->
3.Controller->参数解析器(检测到参数中有设置的注解和参数,则给参数赋值) ->
4.service中进行使用当前用户信息
Controller
package com.haier.strategy.resolution.controller; @Slf4j @RestController @RequestMapping("/api/v1/test") @Tag(name = "测试") public class TestController { @Autowired private TestService testService; /** * 测试 * * @param name * @return */ @Operation(summary = "测试,根据姓名获取学生信息") @GetMapping("/getByName") public StudentVo getByName(@RequestParam("name") String name, @Parameter(hidden = true) @LoginUser UserBo userBo) { return testService.getByName(name, userBo); }
controller通过在参数中注明 @LoginUser UserBo userBo就可以实现在service中获取当前用户信息
注解
/** * 标记需要解析为用户信息的参数 * */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LoginUser { boolean required() default true; }
用户实体类
/** * @Description: 用户实体类 * @Version: V1.0 */ @Schema(description = "用户实体类") @Data public class UserBo { @Schema(description = "用户姓名") private String userName; @Schema(description = "用户工号") private String jobNo; }
userContext
/** * 用户上下文UTIL * */ public class UserContext { /** * User holder * 考虑 TransmittableThreadLocal */ private static final TransmittableThreadLocal<UserBo> CURRENT_USER_HOLDER = new TransmittableThreadLocal<>(); private static final TransmittableThreadLocal<String> CURRENT_AUTHORIZATION = new TransmittableThreadLocal<>(); /** * 保存 session * */ public static void saveUser(UserBo user) { CURRENT_USER_HOLDER.set(user); } /** * 保存authorization */ public static void saveAuthorization(String authorization) { CURRENT_AUTHORIZATION.set(authorization); } /** * 获取authorization */ public static String getAuthorization() { return CURRENT_AUTHORIZATION.get(); } /** * 删除authorization */ public static void removeAuthorization() { CURRENT_AUTHORIZATION.remove(); } /** * 当前用户 * */ public static UserBo currentUser() { return CURRENT_USER_HOLDER.get(); } /** * remove session * */ public static void removeUser() { CURRENT_USER_HOLDER.remove(); } }
拦截器
@Slf4j @Component public class UserLoginInterceptor implements HandlerInterceptor { @Autowired @Lazy private StrategyCommonClient strategyCommonClient; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader(CommonConst.ACCESS_TOKEN); String authorization = request.getHeader(CommonConst.AUTHORIZATION); UserContext.saveAuthorization(authorization); String userCode = request.getHeader(CommonConst.USER_CODE); ResultBody<UserBo> userRes; try { //通过认证服务获取当前用户信息 userRes = commonClient.getUserInfo(userCode, token); } catch (Exception e) { throw new Exception("get_user_info_fail"); } if (userRes.getCode() != 200 || userRes.getData() == null) { throw new Exception("get_user_info_fail"); } UserContext.saveUser(userRes.getData()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { //do nothing } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { UserContext.removeUser(); UserContext.removeAuthorization(); } }
参数解析器
@Slf4j @Component public class LoginUserResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { return parameter.hasParameterAnnotation(LoginUser.class) && parameter.getParameterType().isAssignableFrom(UserBo.class); } @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { return UserContext.currentUser(); } }
到此这篇关于SpringBoot通过参数注解自动获取当前用户信息功能的文章就介绍到这了,更多相关SpringBoot参数注解获取信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- SpringBoot中获取微信用户信息的方法
- SpringBoot+SpringCloud用户信息微服务传递实现解析
- Springboot+Shiro记录用户登录信息并获取当前登录用户信息的实现代码
- SpringBoot使用Redis的zset统计在线用户信息
- Springboot通过请求头获取当前用户信息方法详细示范
- SpringBoot登录、退出、获取用户信息的session处理方案
- springboot如何完美通过token获取用户信息
- springboot登录拦截器+ThreadLocal实现用户信息存储的实例代码
- SpringBoot中的ThreadLocal保存请求用户信息的实例demo
- springboot获取当前用户信息的三种方式