Rumah >pangkalan data >Redis >Bagaimana untuk menyelesaikan masalah menyimpan token pengguna dalam Redis
Apabila mereka bentuk sistem yang serupa dengan e-dagang, keperluan biasa ialah setiap halaman perlu membawa maklumat pengguna yang dilog masuk .
Terdapat dua penyelesaian biasa:
Gunakan kuki untuk menyimpan
Gunakan JWT untuk menyimpan
Tetapi jika cache Redis digunakan dalam sistem, terdapat juga penyelesaian ketiga - cache token pengguna dalam 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; } }); }
Pertama sekali, jelaskan bahawa token: token ialah cara memproses maklumat pengguna untuk bahagian hadapan dan belakang -Tamatkan interaksi selepas log masuk Terdapat dua jenis Kaedah, satu berdasarkan storan sesi, dan satu lagi berdasarkan storan redis. Artikel ini hanya membincangkan pemprosesan maklumat pengguna berdasarkan redis.
Untuk setiap interaksi maklumat selepas pengguna log masuk, jika maklumat pengguna perlu dihantar, terutamanya ID pengguna, dsb., adalah tidak bijak untuk menanyakan pangkalan data setiap kali Kami boleh Cipta ruang dalam redis untuk menyimpan maklumat pengguna, dan kemudian kami akan menggunakannya daripada redis setiap kali kami memerlukan maklumat pengguna.
Mula-mula buat RedisUtil
//注销 @RequestMapping("/logout") public String logout(){ redisTemplate.opsForHash().delete("token","user"); return "/login"; }
Selepas mencipta RedisUtil, simpan nilai dalam redis Pada masa ini, perlu diingatkan bahawa kunci kami perlu dibincangkan dengan bahagian hadapan terlebih dahulu, yang nama medan untuk digunakan, dan hujung semasa Apabila meminta, kunci mesti dihantar dalam pengepala Nilai disulitkan dan dikembalikan ke hujung hadapan selepas log masuk pertama, kami perlu menyahsulit nilai pertama dan gunakan nilai sebagai kunci untuk mendapatkan maklumat pengguna.
@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); } }
Apabila kita memerlukannya
@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); } }
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah menyimpan token pengguna dalam Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!