>  기사  >  데이터 베이스  >  Redis에서 사용자 토큰 저장 문제를 해결하는 방법

Redis에서 사용자 토큰 저장 문제를 해결하는 방법

WBOY
WBOY앞으로
2023-05-31 08:06:101334검색

    Redis는 사용자 토큰을 저장합니다

    전자 상거래와 유사한 시스템을 설계할 때 일반적인 요구 사항은 각 페이지에 로그인된 사용자 정보를 전달해야 한다는 것입니다.

    두 가지 일반적인 솔루션이 있습니다.

    • 쿠키를 사용하여 저장

    • JWT를 사용하여 저장

    그러나 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를 기반으로 토큰 처리&emsp ; 

    우선, token:token은 로그인 후 프런트엔드 및 백엔드 상호작용을 위한 사용자 정보를 처리하는 방식이라는 점은 분명합니다. 크게 두 가지 방식이 있는데, 하나는 세션 저장을 기반으로 하는 것이고, 다른 하나는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제