전자 상거래와 유사한 시스템을 설계할 때 일반적인 요구 사항은 각 페이지에 로그인된 사용자 정보를 전달해야 한다는 것입니다.
두 가지 일반적인 솔루션이 있습니다.
쿠키를 사용하여 저장
JWT를 사용하여 저장
그러나 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"; }
우선, 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!