目錄
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

    用於從照片中去除衣服的線上人工智慧工具。

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    熱門話題

    Laravel 教程
    1605
    29
    PHP教程
    1510
    276
    linux如何限制用戶資源? ulimit怎麼配置? linux如何限制用戶資源? ulimit怎麼配置? May 29, 2025 pm 11:09 PM

    Linux系統通過ulimit命令限制用戶資源,防止資源過度佔用。 1.ulimit是shell內置命令,可限製文件描述符數(-n)、內存大小(-v)、線程數(-u)等,分為軟限制(當前生效值)和硬限制(最高上限)。 2.臨時修改直接使用ulimit命令,如ulimit-n2048,但僅對當前會話有效。 3.永久生效需修改/etc/security/limits.conf及PAM配置文件,並添加sessionrequiredpam_limits.so。 4.systemd服務需在unit文件中設置Lim

    Laravel頁面緩存(Page Cache)策略 Laravel頁面緩存(Page Cache)策略 May 29, 2025 pm 09:15 PM

    Laravel的页面缓存策略可以显著提升网站性能。1)使用cache辅助函数实现页面缓存,如Cache::remember方法。2)选择合适的缓存后端,如Redis。3)注意数据一致性问题,可使用细粒度缓存或事件监听器清除缓存。4)结合路由缓存、视图缓存和缓存标签进一步优化。通过合理应用这些策略,可以有效提升网站性能。

    Redis主從復制故障的排查與修復流程 Redis主從復制故障的排查與修復流程 Jun 04, 2025 pm 08:51 PM

    Redis主從復制故障的排查與修復步驟包括:1.檢查網絡連接,使用ping或telnet測試連通性;2.檢查Redis配置文件,確保replicaof和repl-timeout設置正確;3.查看Redis日誌文件,查找錯誤信息;4.如果是網絡問題,嘗試重啟網絡設備或切換備用路徑;5.如果是配置問題,修改配置文件;6.如果是數據同步問題,使用SLAVEOF命令重新同步數據。

    REDIS是什麼,它與傳統的SQL數據庫有何不同? REDIS是什麼,它與傳統的SQL數據庫有何不同? May 24, 2025 am 12:13 AM

    RedisisuniquecomparedtotraditionalSQLdatabasesinseveralways:1)Itoperatesprimarilyinmemory,enablingfasterreadandwriteoperations.2)Itusesaflexiblekey-valuedatamodel,supportingvariousdatatypeslikestringsandsortedsets.3)Redisisbestusedasacomplementtoexis

    Redis集群節點故障的快速定位與處理 Redis集群節點故障的快速定位與處理 Jun 04, 2025 pm 08:54 PM

    Redis集群節點故障的快速定位與處理步驟如下:1.確認故障:使用CLUSTERNODES命令查看節點狀態,若顯示fail則節點故障。 2.確定原因:檢查網絡、硬件和配置,常見問題包括內存限制超出。 3.修復與恢復:根據原因採取措施,如重啟服務、更換硬件或修正配置。 4.注意事項:確保數據一致性,選擇合適的故障轉移策略,建立監控與告警系統。

    java中間件技術有哪些 常見中間件技術對比分析 java中間件技術有哪些 常見中間件技術對比分析 May 20, 2025 pm 08:06 PM

    Java中間件技術種類繁多,主要包括消息隊列、緩存、負載均衡、應用服務器和分佈式服務框架。 1.消息隊列中間件如ApacheKafka和RabbitMQ,適用於異步通信和數據傳輸。 2.緩存中間件如Redis和Memcached,用於提高數據訪問速度。 3.負載均衡中間件如Nginx和HAProxy,用於分發網絡請求。 4.應用服務器中間件如Tomcat和Jetty,用於部署和管理JavaWeb應用。 5.分佈式服務框架如Dubbo和SpringCloud,用於構建微服務架構。選擇中間件時需考慮性能、可擴

    Redis與RabbitMQ的性能對比與聯合應用場景 Redis與RabbitMQ的性能對比與聯合應用場景 Jun 04, 2025 pm 08:45 PM

    Redis和RabbitMQ在性能和聯合應用場景中各有優勢。 1.Redis在數據讀寫上表現出色,延遲低至微秒級,適合高並發場景。 2.RabbitMQ專注於消息傳遞,延遲在毫秒級,支持多隊列和消費者模型。 3.聯合應用中,Redis可用於數據存儲,RabbitMQ處理異步任務,提升系統響應速度和可靠性。

    解決Redis集群腦裂問題的方法與策略 解決Redis集群腦裂問題的方法與策略 Jun 04, 2025 pm 08:42 PM

    有效解決Redis集群腦裂問題的方法包括:1)網絡配置優化,確保連接穩定性;2)節點監控和故障檢測,使用工具實時監控;3)故障轉移機制,設置高閾值避免多主節點;4)數據一致性保證,使用複制功能同步數據;5)人工干預和恢復,必要時手動處理。

    See all articles