验证码: 看不清楚,换一张 查询 注册会员,免验证
  • {{ basic.site_slogan }}
  • 打开微信扫一扫,
    您还可以在这里找到我们哟

    关注我们

Redis存储用户token问题怎么解决

阅读:602 来源:乙速云 作者:代码code

Redis存储用户token问题怎么解决

      Redis 存储用户token

      在设计类似电商的系统时,一个常见的需求是每个页面都需要携带登录用户信息。

      常见的解决方法有两种:

      • 使用cookie保存

      • 使用JWT保存

      但如果系统中使用了Redis缓存,那么还可以有第三种解决方案–将用户token缓存在Redis中。

      登陆时生成一个token存入Redis

      //生成一个token对象,保存在redis中
      redisTemplate.opsForHash().put("token","user",user);

      在每个页面生成时,提供token

      //以JSON字符串形式返回token
      @RequestMapping(value = "/getToken",method = RequestMethod.GET)
      @ResponseBody
      public User getToken(){
          User user = (User) redisTemplate.opsForHash().get("token", "user");
          return user;
      }
      //发送ajax请求,获取token
      function get_token(){
          $.ajax({
              url:"getToken",
              type:"GET",
              dataType:"JSON",
              success:function(result){
                  //将返回的用户信息保存在token中
                  var token = result;
                  //打印登录用户
                  console.log(token);
                  //打印登录用户的id
                  console.log(token.id);
                  document.getElementById('username').innerText = "用户名:"+token.username;
              }
          });
      }

      注销时,删除token

      //注销
      @RequestMapping("/logout")
      public String logout(){
          redisTemplate.opsForHash().delete("token","user");
          return "/login";
      }

      Redis 处理token问题

      java—基于redis处理token  

      首先明确token:token是用来登录后进行前后端交互用户信息的一种处理方式,主要有两种方式,一种是基于session进行存储,一种是基于redis存储,本文只讨论基于redis做用户信息处理。  

      用户登录之后的每次信息交互,如果需要传递用户信息,尤其是用户id之类的,每次都去查询数据库显然是不明智的,我们可以在登录后在redis创建一个空间用来保存用户信息,之后每次需要用户信息的时候我们就从redis中取用。

      首先创建RedisUtil

      @Component
      
      public class RedisUtil {
      
          @Autowired
          private RedisTemplate redisTemplate;   //key-value是对象的
      
          //判断是否存在key
          public boolean hasKey(String key) {
              return redisTemplate.hasKey(key);
          }
      
          //从redis中获取值
          public Object get(String key) {
              return redisTemplate.opsForValue().get(key);
          }
      
          //向redis插入值
          public boolean set(final String key, Object value) {
              boolean result = false;
              try {
                  redisTemplate.opsForValue().set(key, value);
                  result = true;
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return result;
          }
      
          //向redis插入值带过期时间 单位:分钟
          public boolean set(final String key, Object value, long time) {
              boolean result = false;
              try {
                  redisTemplate.opsForValue().set(key, value, time, TimeUnit.MINUTES);
                  result = true;
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return result;
          }
      
          //redis删除值
          public boolean del(final String key) {
              return redisTemplate.delete(key);
          }
      
          //批量删除某个字段开始的key
          public long batchDel(String key) {
              Set set = redisTemplate.keys(key + "*");
              return redisTemplate.delete(set);
          }
      
      }

      创建RedisUtil之后就是向redis中存值,此时需要注意,我们的key是需要提前和前端商量好,用哪一个字段名,当前端请求时要将key放在header中传递过来,值是第一次登陆后经过加密处理返回给前端的,而我们拿到header信息后就需要先解密value,将value作为key去拿用户信息。

      @Component
      public class UserUtil {
          @Autowired
          private RedisUtil redisUtil;
          @Autowired
          private HttpServletRequest request;
      
          /**
           * 后台管理的登录id
           *
           * @return
           */
          public JsonResult getUser() {
              String header = request.getHeader("#与前端约定的统一字段#");
              //解密
              String decrypt = DESUtil.decrypt(header);
              if (!redisUtil.hasKey(decrypt))return JsonResult.error("未登录");
              User user = null;
              try {
                  user = (User) redisUtil.get(decrypt);
              } catch (Exception e) {
                  e.printStackTrace();
              }
              if (decrypt == null) return JsonResult.error("权限不足");
              return JsonResult.success(user);
          }
      }

      当我们需要取用时

              JsonResult jsonResult = userUtil.getUser();
              if (jsonResult.getCode() != 1) return jsonResult;
              //强转成对象。此处不用担心强转失败,因为存入的时候就是对象存储,只不过为了复用,存的是object类型
              User user= (User) jsonResult.getData();
              return JsonResult.success(#service层#);
          }
    分享到:
    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: hlamps#outlook.com (#换成@)。
    相关文章
    {{ v.title }}
    {{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
    你可能感兴趣
    推荐阅读 更多>