Pc端和移動端 修改 token使用者資訊,資料的一致性
阿新 • • 發佈:2018-12-25
經常會遇到pc端和移動端 登入後 需要在redis裡邊儲存使用者資訊,返回一個token給前端,然後通過token獲取使用者資訊,當pc和移動端修改了使用者資訊之後,另一端會的資料還是不會發生改變,所以要在token儲存的過程中做文章:
- 1
- 登入時:先獲取token(jwt等加密) ,使用者資訊,然後將token為key,使用者id為value 儲存在redis中,然後再通過使用者id為key 儲存使用者資訊:
Jedis jedis = jedisPool.getResource(); try{ subject.login(usernamePasswordToken); LoginRequestModel login = customerService.findByMob(requestModel.getMobile()); JwtUtils jwtUtils = new JwtUtils(); resultMap.put("token",jwtUtils.generateToken(Long.valueOf(login.getId()))); jedis.set(jwtUtils.generateToken(Long.valueOf(login.getId())),login.getMobile()); if(!jedis.exists(login.getMobile())){ jedis.set(login.getMobile(), SerializeUtil.objectSerialiable(login)); } jedis.sadd("online_number",login.getMobile()); resultMap.put("status",0); resultMap.put("message", "登入成功");
部分程式碼;
主要:
jedis.set(jwtUtils.generateToken(Long.valueOf(login.getId())),login.getMobile());
if(!jedis.exists(login.getMobile())){
jedis.set(login.getMobile(), SerializeUtil.objectSerialiable(login));
}
2,通過token獲取使用者資訊
@GetMapping("/index") public AjaxResult index(HttpServletRequest request) { String token = request.getHeader("token"); Jedis jedis = jedisPool.getResource(); try { String tokens = jedis.get(token); if (null != tokens && !tokens.equals("")){ String loginRequest = jedis.get(tokens); LoginRequestModel loginRequestModel = (LoginRequestModel) SerializeUtil.objectDeserialization(loginRequest); if (loginRequestModel.getMobile() != null) { jedis.sadd("online_number", loginRequestModel.getMobile()); return AjaxResult.successState("", 0, loginRequestModel); } else { return AjaxResult.error("驗證失敗", 1); } } } catch (Exception ex) { return AjaxResult.error("驗證失敗" + ex, 1); } finally { jedis.close(); } return AjaxResult.error("驗證失敗", 1); }
主要:
String tokens = jedis.get(token);
if (null != tokens && !tokens.equals("")){
String loginRequest = jedis.get(tokens);
LoginRequestModel loginRequestModel = (LoginRequestModel) SerializeUtil.objectDeserialization(loginRequest);
3.退出時
@GetMapping("/logout") public Map<String,Object> loginout(HttpServletRequest request){ Map<String,Object> resultMap = new LinkedHashMap<>(); Jedis jedis = jedisPool.getResource(); String token = request.getHeader("token"); try{ if(null != token){ String loginRespose =jedis.get(token); if(null == loginRespose || loginRespose.equals("")){ resultMap.put("status",1); resultMap.put("message","資料異常,請重新整理頁面"); }else { String tokens = jedis.get(loginRespose); LoginRequestModel loginRequestModel = (LoginRequestModel) SerializeUtil.objectDeserialization(tokens); jedis.srem("online_number",loginRequestModel.getMobile()); jedis.del(token); resultMap.put("status",0); resultMap.put("message", "您已安全退出!"); } } }catch (Exception e){ System.err.println(e.getMessage()); } finally { jedis.close(); } return resultMap; }
這樣不管是pc端 還是移動端修改了redis中使用者資訊,都會保證資料的一致性;