亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

    齐河县| 德保县| 台湾省| 龙岩市| 黑水县| 瑞安市| 陇南市| 麻城市| 子洲县| 莱芜市| 得荣县| 环江| 满洲里市| 盐源县| 尼玛县| 永寿县| 江华| 景宁| 故城县| 巍山| 施甸县| 台前县| 江山市| 金门县| 淮南市| 朝阳区| 大新县| 宝山区| 疏附县| 阿尔山市| 张家口市| 城口县| 化德县| 兴义市| 江油市| 昌图县| 商城县| 吉安县| 星座| 南部县| 宜章县|