广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Redis妙用之存储用户token问题
  • 762
分享到

Redis妙用之存储用户token问题

Redis妙用Redis存储用户Redis token 2023-03-06 11:03:29 762人浏览 薄情痞子
摘要

目录Redis 存储用户token登陆时生成一个token存入Redis在每个页面生成时,提供token注销时,删除tokenRedis 处理token问题java—基于

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<String> 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;

    
    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层#);
    }

以上就是基于redis的token处理,个人使用习惯不一样,方式可能不同,但是原理大同小异,一般来说,用户信息少的用session存储就可以,大一点的用redis。

总结

这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: Redis妙用之存储用户token问题

本文链接: https://www.lsjlt.com/news/198647.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis妙用之存储用户token问题
    目录Redis 存储用户token登陆时生成一个token存入Redis在每个页面生成时,提供token注销时,删除tokenRedis 处理token问题java—基于...
    99+
    2023-03-06
    Redis妙用 Redis存储用户 Redis token
  • Redis存储用户token问题怎么解决
    这篇文章主要介绍了Redis存储用户token问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Redis存储用户token问题怎么解决文章都会有所收获,下面我们一起来看看吧。Redis 存储用户tok...
    99+
    2023-07-05
  • 使用JWT作为Spring Security OAuth2的token存储问题
    目录序授权服务器整合JWT——对称加解密算法资源服务器整合JWT——对称加解密算法OAuth整合JWT——非对称加解密RSA测试验证测试通过序 Spring Security OAu...
    99+
    2022-11-12
  • 浅析Jmeter多用户token使用问题
    目录背景场景接口登录接口业务接口登录接口处理业务接口处理写在最后背景 在测试的时候,经常会有模拟用户登录,拿到用户 token 后再去请求接口的场景。 这个模拟用户登录就会分为两种,...
    99+
    2022-11-12
  • 如何解决使用JWT作为Spring Security OAuth2的token存储问题
    小编给大家分享一下如何解决使用JWT作为Spring Security OAuth2的token存储问题,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!序Spring Security OAuth3的de...
    99+
    2023-06-22
  • 存储过程访问其他用户的表的问题
    今天写了一个存储过程,需要通过dblink把其他用户下面的表的数据增量copy到目标表中,结果访问其他系统的表的时候,在存储过程中一直有问题,在Stack Overflow中找到了答案。 In...
    99+
    2022-10-18
  • Spring Boot Feign服务调用之间带token问题
    目录Feign服务调服务传递数据带token验证解决方式小结一下Feign调用进行token鉴权1、项目场景2、解决办法3、具体实现Feign服务调服务传递数据带token验证 Fe...
    99+
    2022-11-12
  • Java for循环的妙用之鸡兔同笼问题
    题目描述 已知鸡的数量为n只,兔的数量为m只,鸡兔的总头数为H个鸡兔的总脚数为Y只 for循环语法 for(表达式1;表达式2;表达式3 ){  //循环体 &nbs...
    99+
    2022-11-12
  • Vue保持用户登录状态(各种token存储方式)
    目录怎么设置CookieCookie的缺点: LocalStorage与SessionStorage存储Token LocalStorage与SessionSto...
    99+
    2022-11-12
  • shift妙用之解决shell编程中的入参问题
    我说过了,shell是我的常规武器,目前虽然还不纯熟,但是我爱shell这门语言,在Linux下面混,总要写脚本。程序员是有基因,对编程语言是有偏好的,你让我写C代码,我会觉得很爽,会有困难,会有痛苦的摸索...
    99+
    2022-06-04
    妙用 shift shell
  • 使用redis数据库存储用户信息的示例
    这篇文章给大家分享的是有关使用redis数据库存储用户信息的示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。比较推荐的方式是使用redis数据库中的hash类型来存储。当然使用...
    99+
    2022-10-18
  • Django 缓存问题?试试使用 Go 存储!
    Django 是一个流行的 Python Web 框架,因其简单易用和强大的功能被广泛使用。然而,随着网站的流量增加,缓存问题也随之出现。Django 内置的缓存机制能够很好地解决这个问题,但是在高并发环境下,仍然会存在一些性能瓶颈。为了...
    99+
    2023-11-08
    存储 django 缓存
  • Redis之GEO存储地理位置信息的使用
    目录常用APIgeoaddgeoposgeodistgeoradiusbymembergeohash在外卖软件中的附近的美食店铺、外卖小哥的距离,打车软件附近的车辆,交友软件中附近的...
    99+
    2022-11-12
  • Redis:高效存储大规模用户数据的神器
    Redis:高效存储大规模用户数据的神器,需要具体代码示例在如今这个互联网时代,存储和处理用户数据已经成为了公司发展的核心问题之一。尤其是对于那些需要处理海量用户数据的互联网公司来说,如何高效地存储和处理数据,成为了一道难以绕过的技术难题。...
    99+
    2023-11-07
    redis 高效存储 大规模用户数据
  • 使用 Azure Container Registry 储存镜像的问题
    Azure Container Registry(容器注册表)是基于 Docker Registry 2.0规范的托管专用 Docker 注册表服务。 可以创建和维护 Azure 容...
    99+
    2022-11-12
  • Vuex处理用户Token过期及优化设置封装本地存储操作模块
    目录1. 处理用户 Token2. 优化封装本地存储操作模块 - 封装localStrage功能3. Vuex各属性的使用4. 关于 Token 过期问题5.优化设置 Token1....
    99+
    2022-11-13
  • 如何解决亿级用户的分布式数据库数据存储问题
    这篇文章给大家介绍如何解决亿级用户的分布式数据库数据存储问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、MySQL复制1.MySQL的主从复制MySQL的主从复制,就是将MySQ...
    99+
    2022-10-19
  • Android使用DocumentFile读写外置存储的问题
    最近在维护项目,app遇到安装在高版本的Android时,以往直接授权和new File(path)的形式不再支持,日志也是说Permission denied。。。。。好吧,换为D...
    99+
    2022-11-12
  • 关于SpringBoot整合redis使用Lettuce客户端超时问题
    参考的博客 问题起因 做毕设的时候,使用到Lettuce连接redis,一段时间后不操作,再去操作redis,会报连接超时错误,在其重连后又可使用。 原因是:Lettuce 自适应拓...
    99+
    2022-11-12
  • Java调用存储过程事务问题怎么解决
    在Java中调用存储过程时,可以使用JDBC提供的事务管理功能来解决事务问题。以下是解决事务问题的一般步骤:1. 创建数据库连接:使...
    99+
    2023-10-24
    Java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作