思路: 第一次用户登陆时生成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); }