SpringBoot中使用HandlerMethodArgumentResolver用于统一获取当前登录用户

概述

前端请求接口时,经常用到token验证,并获取用户信息,通常做法是util包中创建一个UserTokenManager类,controller层的接口获取token,通过UserTokenManager.getUserByToken(token) 来获取用户信息。
本篇介绍另一种方法,通过HandlerMethodArgumentResolver和注解,统一获取当前登录用户

在SpringBoot中使用HandlerMethodArgumentResolver

  1. 创建util包,并创建UserTokenManager.java 用户Token管理类
public class UserTokenManager {
     //生成TOKEN
    public static String generateToken(Integer id) {
        JwtHelper jwtHelper = new JwtHelper();
        return jwtHelper.createToken(id);
    } 

    //根据TOKEN获取用户ID
    public static Integer getUserId(String token) {
    	JwtHelper jwtHelper = new JwtHelper();
    	Integer userId = jwtHelper.verifyTokenAndGetUserId(token);
    	if(userId == null || userId == 0){
    		return null;
    	}
        return userId;
    }
}
  1. 创建注解LoginUser
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {

}
  1. 创建annotation包,并创建LoginUserHandlerMethodArgumentResolver自定义方法参数解析器,并继承HandlerMethodArgumentResolver
public class LoginUserHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    public static final String LOGIN_TOKEN_KEY = "X-Authentication-Token";

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType().isAssignableFrom(Integer.class) && parameter.hasParameterAnnotation(LoginUser.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer container,
                                  NativeWebRequest request, WebDataBinderFactory factory) throws Exception {

//        return new Integer(1);
        String token = request.getHeader(LOGIN_TOKEN_KEY);
        if (token == null || token.isEmpty()) {
            return null;
        }

        return UserTokenManager.getUserId(token);
    }
}
  1. 创建WxWebMvcConfiguration配置类,并继承WebMvcConfigurer
@Configuration
public class WxWebMvcConfiguration implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(new LoginUserHandlerMethodArgumentResolver());
    }
}
  1. OK,做好以上这些准备工作,就可以在接口里使用@LoginUser注解了,如下
@RestController
@RequestMapping("/wx/user")
@Validated
public class WxUserController {
    private final Log logger = LogFactory.getLog(WxUserController.class);

    @Autowired
    private LitemallOrderService orderService;

    /**
     * 用户个人页面数据
     * <p>
     * 目前是用户订单统计信息
     *
     * @param userId 用户ID
     * @return 用户个人页面数据
     */
    @GetMapping("index")
    public Object list(@LoginUser Integer userId) {
        //通过@LoginUser获取userId,判断用户是否登录
        if (userId == null) {
            return ResponseUtil.unlogin();
        }

        Map<Object, Object> data = new HashMap<Object, Object>();
       //TODO 业务数据data填充
        return ResponseUtil.ok(data);
    }

}

总结

好了,以上就是SpringBoot中,通过HandlerMethodArgumentResolver来统一获取当前登录用户的方法。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值