1. 程式人生 > >Pc端和移動端 修改 token使用者資訊,資料的一致性

Pc端和移動端 修改 token使用者資訊,資料的一致性

經常會遇到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中使用者資訊,都會保證資料的一致性;