版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cd420928908/article/details/84392817
经常会遇到pc端和移动端 登录后 需要在redis里边存储用户信息,返回一个token给前端,然后通过token获取用户信息,当pc和移动端修改了用户信息之后,另一端会的数据还是不会发生改变,所以要在token存储的过程中做文章:
- 1
- 登录时:先获取token(jwt等加密) ,用户信息,然后将token为key,用户id为value 保存在redis中,然后再通过用户id为key 存储用户信息:
Jedis jedis = jedisPool.getResource();
try{
subject.login(usernamePasswordToken);
LoginRequestModel login = customerService.findByMob(requestModel.getMobile());
JwtUtils jwtUtils = new JwtUtils();
resultMap.put("token",jwtUtils.generateToken(Long.valueOf(login.getId())));
jedis.set(jwtUtils.generateToken(Long.valueOf(login.getId())),login.getMobile());
if(!jedis.exists(login.getMobile())){
jedis.set(login.getMobile(), SerializeUtil.objectSerialiable(login));
}
jedis.sadd("online_number",login.getMobile());
resultMap.put("status",0);
resultMap.put("message", "登录成功");
部分代码;
主要:
jedis.set(jwtUtils.generateToken(Long.valueOf(login.getId())),login.getMobile());
if(!jedis.exists(login.getMobile())){
jedis.set(login.getMobile(), SerializeUtil.objectSerialiable(login));
}
2,通过token获取用户信息
@GetMapping("/index")
public AjaxResult index(HttpServletRequest request) {
String token = request.getHeader("token");
Jedis jedis = jedisPool.getResource();
try {
String tokens = jedis.get(token);
if (null != tokens && !tokens.equals("")){
String loginRequest = jedis.get(tokens);
LoginRequestModel loginRequestModel = (LoginRequestModel) SerializeUtil.objectDeserialization(loginRequest);
if (loginRequestModel.getMobile() != null) {
jedis.sadd("online_number", loginRequestModel.getMobile());
return AjaxResult.successState("", 0, loginRequestModel);
} else {
return AjaxResult.error("验证失败", 1);
}
}
} catch (Exception ex) {
return AjaxResult.error("验证失败" + ex, 1);
} finally {
jedis.close();
}
return AjaxResult.error("验证失败", 1);
}
主要:
String tokens = jedis.get(token);
if (null != tokens && !tokens.equals("")){
String loginRequest = jedis.get(tokens);
LoginRequestModel loginRequestModel = (LoginRequestModel) SerializeUtil.objectDeserialization(loginRequest);
3.退出时
@GetMapping("/logout")
public Map<String,Object> loginout(HttpServletRequest request){
Map<String,Object> resultMap = new LinkedHashMap<>();
Jedis jedis = jedisPool.getResource();
String token = request.getHeader("token");
try{
if(null != token){
String loginRespose =jedis.get(token);
if(null == loginRespose || loginRespose.equals("")){
resultMap.put("status",1);
resultMap.put("message","数据异常,请刷新页面");
}else {
String tokens = jedis.get(loginRespose);
LoginRequestModel loginRequestModel = (LoginRequestModel) SerializeUtil.objectDeserialization(tokens);
jedis.srem("online_number",loginRequestModel.getMobile());
jedis.del(token);
resultMap.put("status",0);
resultMap.put("message", "您已安全退出!");
}
}
}catch (Exception e){
System.err.println(e.getMessage());
}
finally {
jedis.close();
}
return resultMap;
}
这样不管是pc端 还是移动端修改了redis中用户信息,都会保证数据的一致性;