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

    熱門文章

    倉庫:如何復興隊友
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island冒險:如何獲得巨型種子
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
    1 週前 By 尊渡假赌尊渡假赌尊渡假赌

    熱門文章

    倉庫:如何復興隊友
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    Hello Kitty Island冒險:如何獲得巨型種子
    3 週前 By 尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
    1 週前 By 尊渡假赌尊渡假赌尊渡假赌

    熱門文章標籤

    記事本++7.3.1

    記事本++7.3.1

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

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

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

    Windows11安裝10.0.22000.100跳出0x80242008錯誤解決方法 Windows11安裝10.0.22000.100跳出0x80242008錯誤解決方法 May 08, 2024 pm 03:50 PM

    Windows11安裝10.0.22000.100跳出0x80242008錯誤解決方法

    redis如何修改密碼 redis如何修改密碼 Apr 20, 2024 am 03:00 AM

    redis如何修改密碼

    剖析 PHP 函數瓶頸,提升執行效率 剖析 PHP 函數瓶頸,提升執行效率 Apr 23, 2024 pm 03:42 PM

    剖析 PHP 函數瓶頸,提升執行效率

    redis是記憶體快取嗎 redis是記憶體快取嗎 Apr 20, 2024 am 05:26 AM

    redis是記憶體快取嗎

    Golang API快取策略與最佳化 Golang API快取策略與最佳化 May 07, 2024 pm 02:12 PM

    Golang API快取策略與最佳化

    redis是非關係型資料庫嗎 redis是非關係型資料庫嗎 Apr 20, 2024 am 05:36 AM

    redis是非關係型資料庫嗎

    PHP開發中的快取機制與應用實戰 PHP開發中的快取機制與應用實戰 May 09, 2024 pm 01:30 PM

    PHP開發中的快取機制與應用實戰

    erlang和golang性能哪個好? erlang和golang性能哪個好? Apr 21, 2024 am 03:24 AM

    erlang和golang性能哪個好?

    See all articles