電子商取引と同様のシステムを設計する場合、共通の要件は、各ページにログイン ユーザー情報を保持する必要があることです。 。
一般的な解決策は 2 つあります。
Cookie を使用して保存する
JWT を使用して保存する
しかし、システムで Redis キャッシュが使用されている場合は、3 番目の解決策があります。それは、ユーザー トークンを 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"; }
まず、トークンがフロントエンドおよびフロントエンドのユーザー情報を処理する方法であることを明確にしてください。メソッドには主に 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 サイトの他の関連記事を参照してください。