中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis存儲用戶token問題怎么解決

發布時間:2023-03-06 14:18:53 來源:億速云 閱讀:126 作者:iii 欄目:開發技術

這篇文章主要介紹了Redis存儲用戶token問題怎么解決的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇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問題怎么解決”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Redis存儲用戶token問題怎么解決”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    祥云县| 峨眉山市| 米林县| 雷山县| 英德市| 和顺县| 卢湾区| 晋中市| 天台县| 邯郸县| 东乡族自治县| 枞阳县| 巴彦淖尔市| 拜泉县| 多伦县| 香港| 云林县| 驻马店市| 宁武县| 邵阳市| 阿拉尔市| 铜梁县| 泽州县| 崇州市| 旬邑县| 谢通门县| 棋牌| 桃园县| 平乡县| 巴马| 阿图什市| 炉霍县| 卢湾区| 温泉县| 宣汉县| 嘉禾县| 辽宁省| 出国| 雷波县| 江都市| 定州市|