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

其他教程   发布日期:2023年07月28日   浏览次数:394

这篇文章主要介绍了Redis存储用户token问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis存储用户token问题怎么解决文章都会有所收获,下面我们一起来看看吧。

    Redis 存储用户token

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

    常见的解决方法有两种:

    • 使用cookie保存

    • 使用JWT保存

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

    登陆时生成一个token存入Redis

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

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

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

    注销时,删除token

    1. //注销
    2. @RequestMapping("/logout")
    3. public String logout(){
    4. redisTemplate.opsForHash().delete("token","user");
    5. return "/login";
    6. }

    Redis 处理token问题

    java—基于redis处理token  

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

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

    首先创建RedisUtil

    1. @Component
    2. public class RedisUtil {
    3. @Autowired
    4. private RedisTemplate redisTemplate; //key-value是对象的
    5. //判断是否存在key
    6. public boolean hasKey(String key) {
    7. return redisTemplate.hasKey(key);
    8. }
    9. //从redis中获取值
    10. public Object get(String key) {
    11. return redisTemplate.opsForValue().get(key);
    12. }
    13. //向redis插入值
    14. public boolean set(final String key, Object value) {
    15. boolean result = false;
    16. try {
    17. redisTemplate.opsForValue().set(key, value);
    18. result = true;
    19. } catch (Exception e) {
    20. e.printStackTrace();
    21. }
    22. return result;
    23. }
    24. //向redis插入值带过期时间 单位:分钟
    25. public boolean set(final String key, Object value, long time) {
    26. boolean result = false;
    27. try {
    28. redisTemplate.opsForValue().set(key, value, time, TimeUnit.MINUTES);
    29. result = true;
    30. } catch (Exception e) {
    31. e.printStackTrace();
    32. }
    33. return result;
    34. }
    35. //redis删除值
    36. public boolean del(final String key) {
    37. return redisTemplate.delete(key);
    38. }
    39. //批量删除某个字段开始的key
    40. public long batchDel(String key) {
    41. Set<String> set = redisTemplate.keys(key + "*");
    42. return redisTemplate.delete(set);
    43. }
    44. }

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

    1. @Component
    2. public class UserUtil {
    3. @Autowired
    4. private RedisUtil redisUtil;
    5. @Autowired
    6. private HttpServletRequest request;
    7. /**
    8. * 后台管理的登录id
    9. *
    10. * @return
    11. */
    12. public JsonResult getUser() {
    13. String header = request.getHeader("#与前端约定的统一字段#");
    14. //解密
    15. String decrypt = DESUtil.decrypt(header);
    16. if (!redisUtil.hasKey(decrypt))return JsonResult.error("未登录");
    17. User user = null;
    18. try {
    19. user = (User) redisUtil.get(decrypt);
    20. } catch (Exception e) {
    21. e.printStackTrace();
    22. }
    23. if (decrypt == null) return JsonResult.error("权限不足");
    24. return JsonResult.success(user);
    25. }
    26. }

    当我们需要取用时

    1. JsonResult jsonResult = userUtil.getUser();
    2. if (jsonResult.getCode() != 1) return jsonResult;
    3. //强转成对象。此处不用担心强转失败,因为存入的时候就是对象存储,只不过为了复用,存的是object类型
    4. User user= (User) jsonResult.getData();
    5. return JsonResult.success(#service层#);
    6. }

    以上就是Redis存储用户token问题怎么解决的详细内容,更多关于Redis存储用户token问题怎么解决的资料请关注九品源码其它相关文章!