单一登陆,同用户同系统不同设备同时登陆时顶号,redis实现

 思路:
    第一次用户登陆时生成UUID随机数作为token 查数据库获取用户信息 保存redis中  key token value 用户iduserId,
 同时保存 key userId ,value用户基本信息实体其中包含token字段息, 返回用户基本信息,每次请求时传token去查redis中是否存在
当第二次登陆时 先查数据库获取userId 拿到userId去redis里查询用户实体是否存在,存在说明之前登陆过,拿到其中token,根据key token删除保存在redis中的信息,redis保存新的 key token  和 key userId 

思路:
    第一次用户登陆时生成UUID随机数作为token 查数据库获取用户信息 保存redis中  key token value 用户iduserId,
 同时保存 key userId ,value用户基本信息实体其中包含token字段息, 返回用户基本信息,每次请求时传token去查redis中是否存在
当第二次登陆时 先查数据库获取userId 拿到userId去redis里查询用户实体是否存在,存在说明之前登陆过,拿到其中token,根据key token删除保存在redis中的信息,redis保存新的 key token  和 key userId 

登陆逻辑token处理

/**
 * 登陆处理
 * @param lmUserEntity
 * @return
 * @throws Exception
 */
public String handleLogin(LmUserEntity  lmUserEntity) throws Exception {
    LmUserEntity info = this.getUserByUserId(lmUserEntity.getUserId());
    if (info != null) {
        this.delToken(info.getToken());
        logger.info("清除原登陆token:"+info.getToken());
    }
    String token=this.setLoginToken(lmUserEntity.getUserId());
    logger.info("生成token:"+token);
    lmUserEntity.setToken(token);
    this.setUserByUserId(lmUserEntity);
    return token;
}
用户实体
public class LmUserEntity implements Serializable {
   private static final long serialVersionUID = 1L;
   
   //
   private Integer id;
private String token;

private String userMobile;

private String userName;

private String userPassword;
/**
拦截器
*/

@Configuration
public class AddInterceptorsConfig implements WebMvcConfigurer {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1
        corsConfiguration.addAllowedHeader("*"); // 2
        corsConfiguration.addAllowedMethod("*"); // 3
        return corsConfiguration;
    }

    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }
    @Bean
    public HandlerInterceptor getInterceptor() {
        return new LoginInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {


        registry.addInterceptor(getInterceptor())
                .addPathPatterns("/user/**"); 
    }

}

public class LoginInterceptor implements HandlerInterceptor{
    private static Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
    @Autowired
    private TokenRedisUtils tokenUtils;

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token=request.getHeader("tokenStr");
        response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
        if (StringUtils.isBlank(token)){
            logger.info("未获取到tokenStr");
            //用户未登录
            response.getWriter().print(JSONObject.toJSON(ResultDto.hasCodeFail("token失效","204")));
            return false;
        }else {
           Object o= tokenUtils.getLoginToken(token);
            if(null==o){
                logger.info("未查询到token记录:"+token);
                //登录失效
                response.getWriter().print(JSONObject.toJSON(ResultDto.hasCodeFail("token失效","204")));
                return false;
            }
            LmUserEntity userEntity=tokenUtils.getUserByToken(o.toString());
            if (userEntity ==null ){
                logger.info("未查询到用户信息token:"+token+",userId:"+o.toString());
                response.getWriter().print(JSONObject.toJSON(ResultDto.hasCodeFail("token失效","204")));
                return false;
            } 
        }
        return true;
    }

public String setLoginToken(String userId) throws Exception {
    String uuid = UUId.getUUid();
    redisService.set(LM_R_LOGIN + uuid, userId, 60*60*24*7);
    return uuid;
}

public boolean setUserByUserId(LmUserEntity userEntity) throws Exception {
    return redisService.set(LM_R_LOGIN + userEntity.getUserId(), JSON.toJSONString(userEntity),60*60*24*7);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾宝玉的贾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值