目录
Redis 存储用户token
登陆时生成一个token存入Redis
在每个页面生成时,提供token
注销时,删除token
Redis 处理token问题
java—基于redis处理token  
首页 数据库 Redis Redis存储用户token问题怎么解决

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

May 31, 2023 am 08:06 AM
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<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;
    
        /**
         * 后台管理的登录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层#);
        }

    以上是Redis存储用户token问题怎么解决的详细内容。更多信息请关注PHP中文网其他相关文章!

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Stock Market GPT

    Stock Market GPT

    人工智能驱动投资研究,做出更明智的决策

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    热门话题

    如何用PHP结合AI实现文本纠错 PHP语法检测与优化 如何用PHP结合AI实现文本纠错 PHP语法检测与优化 Jul 25, 2025 pm 08:57 PM

    要实现PHP结合AI进行文本纠错与语法优化,需按以下步骤操作:1.选择适合的AI模型或API,如百度、腾讯API或开源NLP库;2.通过PHP的curl或Guzzle调用API并处理返回结果;3.在应用中展示纠错信息并允许用户选择是否采纳;4.使用php-l和PHP_CodeSniffer进行语法检测与代码优化;5.持续收集反馈并更新模型或规则以提升效果。选择AIAPI时应重点评估准确率、响应速度、价格及对PHP的支持。代码优化应遵循PSR规范、合理使用缓存、避免循环查询、定期审查代码,并借助X

    如何用PHP开发问答社区平台 PHP互动社区变现模式详解 如何用PHP开发问答社区平台 PHP互动社区变现模式详解 Jul 23, 2025 pm 07:21 PM

    1.PHP开发问答社区首选Laravel MySQL Vue/React组合,因生态成熟、开发效率高;2.高性能需依赖缓存(Redis)、数据库优化、CDN和异步队列;3.安全性必须做好输入过滤、CSRF防护、HTTPS、密码加密及权限控制;4.变现可选广告、会员订阅、打赏、佣金、知识付费等模式,核心是匹配社区调性和用户需求。

    PHP实现商品库存管理变现 PHP库存同步与报警机制 PHP实现商品库存管理变现 PHP库存同步与报警机制 Jul 25, 2025 pm 08:30 PM

    PHP通过数据库事务与FORUPDATE行锁确保库存扣减原子性,防止高并发超卖;2.多平台库存一致性需依赖中心化管理与事件驱动同步,结合API/Webhook通知及消息队列保障数据可靠传递;3.报警机制应分场景设置低库存、零/负库存、滞销、补货周期和异常波动策略,并按紧急程度选择钉钉、短信或邮件通知责任人,且报警信息需完整明确,以实现业务适配与快速响应。

    如何用PHP结合AI做图像生成 PHP自动生成艺术作品 如何用PHP结合AI做图像生成 PHP自动生成艺术作品 Jul 25, 2025 pm 07:21 PM

    PHP不直接进行AI图像处理,而是通过API集成,因为它擅长Web开发而非计算密集型任务,API集成能实现专业分工、降低成本、提升效率;2.整合关键技术包括使用Guzzle或cURL发送HTTP请求、JSON数据编解码、API密钥安全认证、异步队列处理耗时任务、健壮错误处理与重试机制、图像存储与展示;3.常见挑战有API成本失控、生成结果不可控、用户体验差、安全风险和数据管理难,应对策略分别为设置用户配额与缓存、提供prompt指导与多图选择、异步通知与进度提示、密钥环境变量存储与内容审核、云存

    如何用PHP实现AI内容推荐系统 PHP智能内容分发机制 如何用PHP实现AI内容推荐系统 PHP智能内容分发机制 Jul 23, 2025 pm 06:12 PM

    1.PHP在AI内容推荐系统中主要承担数据收集、API通信、业务规则处理、缓存优化与推荐展示等角色,而非直接执行复杂模型训练;2.系统通过PHP收集用户行为与内容数据,调用后端AI服务(如Python模型)获取推荐结果,并利用Redis缓存提升性能;3.基础推荐算法如协同过滤或内容相似度可在PHP中实现轻量级逻辑,但大规模计算仍依赖专业AI服务;4.优化需关注实时性、冷启动、多样性及反馈闭环,挑战包括高并发性能、模型更新平稳性、数据合规与推荐可解释性,PHP需协同消息队列、数据库与前端共同构建稳

    PHP集成AI语音识别与转写 PHP会议记录自动生成方案 PHP集成AI语音识别与转写 PHP会议记录自动生成方案 Jul 25, 2025 pm 07:06 PM

    选择合适AI语音识别服务并集成PHPSDK;2.用PHP调用ffmpeg将录音转为API要求格式(如wav);3.上传文件至云存储并调用API异步识别;4.解析JSON结果并用NLP技术整理文本;5.生成Word或Markdown文档完成会议记录自动化,全过程需确保数据加密、访问控制与合规性以保障隐私安全。

    如何搭建独立PHP任务容器环境 PHP定时脚本运行容器配置方法 如何搭建独立PHP任务容器环境 PHP定时脚本运行容器配置方法 Jul 25, 2025 pm 07:27 PM

    搭建独立PHP任务容器环境可通过Docker实现,具体步骤如下:1.安装Docker与DockerCompose作为基础;2.创建独立目录存放Dockerfile、crontab文件;3.编写Dockerfile定义PHPCLI环境并安装cron及必要扩展;4.编写crontab文件定义定时任务;5.编写docker-compose.yml挂载脚本目录并配置环境变量;6.启动容器并验证日志。相比Web容器内执行定时任务,独立容器具备资源隔离、环境纯粹、稳定性强、便于扩展等优势。为确保日志与错误捕

    如何用PHP构建日志管理系统 PHP日志采集与分析工具 如何用PHP构建日志管理系统 PHP日志采集与分析工具 Jul 25, 2025 pm 08:48 PM

    选择日志记录方式:初期可用PHP内置error_log(),项目扩大后务必切换至Monolog等成熟库,支持多handler和日志级别,确保日志含时间戳、级别、文件行号及错误详情;2.设计存储结构:小量日志可文件存储,大量或需分析则选数据库,结构化数据用MySQL/PostgreSQL,半结构化/非结构化推荐Elasticsearch Kibana,同时制定备份与定期清理策略;3.开发分析界面:应具备搜索、过滤、聚合、可视化功能,可直接集成Kibana,或用PHP框架 图表库自研,注重界面简洁易

    See all articles