Heim > Datenbank > Redis > Hauptteil

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

WBOY
Freigeben: 2023-05-31 08:06:10
nach vorne
1328 Leute haben es durchsucht

    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);
    Nach dem Login kopieren

    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;
    }
    Nach dem Login kopieren
    //发送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;
            }
        });
    }
    Nach dem Login kopieren
    .

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

    //注销
    @RequestMapping("/logout")
    public String logout(){
        redisTemplate.opsForHash().delete("token","user");
        return "/login";
    }
    Nach dem Login kopieren
    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);
        }
    
    }
    Nach dem Login kopieren

    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);
        }
    }
    Nach dem Login kopieren

    Wenn wir es brauchen

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

    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!

    Verwandte Etiketten:
    Quelle:yisu.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage
    Über uns Haftungsausschluss Sitemap
    Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!