Heim  >  Artikel  >  Datenbank  >  So lösen Sie das Problem der Speicherung von Benutzertokens in Redis

So lösen Sie das Problem der Speicherung von Benutzertokens in Redis

WBOY
WBOYnach vorne
2023-05-31 08:06:101425Durchsuche

    Redis speichert Benutzertokens

    Beim Entwerfen eines E-Commerce-ähnlichen Systems besteht eine allgemeine Anforderung darin, dass jede Seite Informationen über angemeldete Benutzer enthalten muss.

    Es gibt zwei gängige Lösungen:

    • Verwenden Sie Cookies zum Speichern.

    • Verwenden Sie JWT zum Speichern.

    Aber wenn Redis-Cache im System verwendet wird, gibt es auch eine dritte Lösung: Benutzer-Tokens zwischenspeichern in Redis.

    Generieren Sie ein Token und speichern Sie es in Redis, wenn Sie sich anmelden.

    //生成一个token对象,保存在redis中
    redisTemplate.opsForHash().put("token","user",user);

    Wenn jede Seite generiert wird, geben Sie das Token an.

    //以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;
            }
        });
    }
    .

    Wenn Sie sich abmelden, löschen Sie das Token.

    //注销
    @RequestMapping("/logout")
    public String logout(){
        redisTemplate.opsForHash().delete("token","user");
        return "/login";
    }
    basierend auf redis  

    Zunächst ist klar, dass Token: Token eine Möglichkeit ist, Benutzerinformationen für die Front-End- und Back-End-Interaktion nach der Anmeldung zu verarbeiten. Es gibt zwei Hauptmethoden, eine basiert auf der Sitzung Der andere basiert auf Redis-Speicher. In diesem Artikel wird nur die Verwendung von Redis als Benutzer erläutert.   

    Wenn bei jeder Informationsinteraktion nach der Anmeldung Benutzerinformationen, insbesondere Benutzer-IDs usw., übergeben werden müssen, ist es offensichtlich unklug, die Datenbank jedes Mal abzufragen. Wir können danach eine Datenbank in Redis erstellen Anmelden. Der Speicherplatz wird zum Speichern von Benutzerinformationen verwendet und wir rufen ihn jedes Mal von Redis ab, wenn wir Benutzerinformationen benötigen.

    Erstellen Sie zuerst 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);
        }
    
    }

    Speichern Sie nach dem Erstellen von RedisUtil den Wert in Redis. Zu diesem Zeitpunkt ist zu beachten, dass unser Schlüssel im Voraus mit dem Front-End besprochen werden muss, welcher Feldname verwendet werden soll und welcher Schlüssel muss im Header platziert werden, wenn die Front-End-Anforderungen übergeben werden. Der Wert wird verschlüsselt und nach der ersten Anmeldung an das Front-End zurückgegeben. Nachdem wir die Header-Informationen erhalten haben, müssen wir den Wert zuerst entschlüsseln und als Wert verwenden Taste, um die Benutzerinformationen abzurufen.

    @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);
        }
    }

    Wenn wir es brauchen

            JsonResult jsonResult = userUtil.getUser();
            if (jsonResult.getCode() != 1) return jsonResult;
            //强转成对象。此处不用担心强转失败,因为存入的时候就是对象存储,只不过为了复用,存的是object类型
            User user= (User) jsonResult.getData();
            return JsonResult.success(#service层#);
        }

    Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der Speicherung von Benutzertokens in Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen