【ThreadLocal+拦截器】获取上下文信息

背景:在后台开发中,相关的接口需要获取用户登录的手机号识别用户的身份,目前用户的手机号存储在前端上送的cookie中,想要获取用户手机号,目前存在两种思路:

思路一:每个接口中前端都上送手机号,但是这种方法,前端开发者不喜欢这样做,每个接口都存在该字段,前端的想法会是将该字段放在header中,每次请求中header中都存在手机号字段。

思路二:后端从cookie中获取手机号。

以上两种方法,后端都需要封装一个统一的方法来获取用户手机号,如果一个接口写一个获取登录手机号的方法,代码冗余量很大。因此结合ThreadLocal+拦截器获取用户登录手机号。

代码实现如下:

所需要获取的信息对象:

@Data
public class LoginUserInfo {

    /**
     * 手机号
     */
    private String mobileNo;
}

上下文信息类:

public class AuthLoginUserContext {

    private static final ThreadLocal<LoginUserInfo> LOGIN_USER_INFO_THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 设置登录用户信息
     * @param loginUserInfo
     */
    public static void setLoginUser(LoginUserInfo loginUserInfo) {
        if (loginUserInfo != null) {
            LOGIN_USER_INFO_THREAD_LOCAL.set(loginUserInfo);
        } else {
            LOGIN_USER_INFO_THREAD_LOCAL.remove();
        }
    }

    /**
     * 获取用户登录信息
     * @return
     */
    public static LoginUserInfo getLoginUserInfo() {
        return LOGIN_USER_INFO_THREAD_LOCAL.get();
    }

    /**
     * 获取登录用户手机号
     * @return
     */
    public static String getLoginUserMobile() {
        return Optional.ofNullable(LOGIN_USER_INFO_THREAD_LOCAL.get()).map(LoginUserInfo::getMobileNo)
                .orElseThrow(() -> UnLoginException.of(ErrorCode.UNAUTHORIZED));
    }
}

我们在拦截器中调用上述的set方法:

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//省略从cookie中获取数据的代码  AuthLoginUserContext.setLoginUser(LoginUserInfo.builder().mobileNo(object.getMobileNo()).build());
                   
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        AuthLoginUserContext.setLoginUser(null);
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值