Redis にユーザー トークンを保存する際の問題を解決する方法

WBOY
リリース: 2023-05-31 08:06:10
転載
1432 人が閲覧しました

    Redis はユーザー トークンを保存します

    電子商取引と同様のシステムを設計する場合、共通の要件は、各ページにログイン ユーザー情報を保持する必要があることです。 。

    一般的な解決策は 2 つあります。

    • Cookie を使用して保存する

    • JWT を使用して保存する

    しかし、システムで Redis キャッシュが使用されている場合は、3 番目の解決策があります。それは、ユーザー トークンを Redis にキャッシュすることです。

    ログイン時にトークンを生成し、Redis に保存します

    //生成一个token对象,保存在redis中
    redisTemplate.opsForHash().put("token","user",user);
    ログイン後にコピー

    各ページが生成されたら、トークンを提供します

    //以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;
            }
        });
    }
    ログイン後にコピー

    ログアウト時にトークンを削除します

    //注销
    @RequestMapping("/logout")
    public String logout(){
        redisTemplate.opsForHash().delete("token","user");
        return "/login";
    }
    ログイン後にコピー

    Redis トークンの問題への対処

    java—redis に基づくトークンの処理

    まず、トークンがフロントエンドおよびフロントエンドのユーザー情報を処理する方法であることを明確にしてください。メソッドには主に 2 つのタイプがあり、1 つはセッション ストレージに基づくもの、もう 1 つは 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 に保存する必要があります。このとき、キーをユーザーと話し合う必要があることに注意する必要があります。事前のフロントエンド、使用するフィールド名、および現在のエンド リクエストするとき、キーをヘッダーで渡す必要があります。値は暗号化され、最初のログイン後にフロントエンドに返されます。ヘッダー情報を取得した後, まず値を復号化し、その値をキーとして使用してユーザー情報を取得する必要があります。

    @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 にユーザー トークンを保存する際の問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート