Redis实战之session共享( 二 )


, CopyOptions.create()
.setIgnoreNullValue(true)
.setFieldValueEditor((fieldName,fieldValue)->fieldValue.toString()));
stringRedisTemplate.opsForHash().putAll(LOGIN_USER_TOKEN_KEY+token,userMap);
//LOGIN_USER_TOKEN_TTL
stringRedisTemplate.expire(LOGIN_USER_TOKEN_KEY+token,LOGIN_USER_TOKEN_TTL,TimeUnit.MINUTES);
//2.3.3: 将token返回
return Result.ok(token);
需要注意:
在使用stringRedisTemplate存放hash对象的时候,对象中所有的key只能是string类型,如果存在非string类型会报错的 。所以这里使用了hootool的BeanUtil工具类:
Map userMap = BeanUtil.beanToMap(userDTO,new HashMap<>()
, CopyOptions.create()
.setIgnoreNullValue(true)
.setFieldValueEditor((fieldName,fieldValue)->fieldValue.toString()));
拦截器修改代码:
因为拦截器是我们自定义的,所以不能被spring容器管理的,RedisTemplate就不能自动注入了 。我们就使用有参构造器,传递

Redis实战之session共享

文章插图
public class LoginRedisInterceptor implements HandlerInterceptor {
private StringRedisTemplate stringRedisTemplate;
* 因为这个类不能被spring管理,所以不能直接注入RedisTemplate对象 。通过构造函数传递
* @param stringRedisTemplate
public LoginRedisInterceptor(StringRedisTemplate stringRedisTemplate){
this.stringRedisTemplate = stringRedisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1:从请求中获取到token
String token = request.getHeader("authorization");
if(StringUtils.isEmpty(token)){
response.setStatus(401);
return false;
//2:基于token获取redis中用户对象
String key = LOGIN_USER_TOKEN_KEY+token;
Map userMap = stringRedisTemplate.opsForHash().entries(key);
//3:判断
if(userMap.isEmpty()){
response.setStatus(401);
return false;
//将map转对象
UserDTO user = BeanUtil.fillBeanWithMap(userMap, new UserDTO(), false);
UserHolder.saveUser(user);
//刷新token的过期时间
stringRedisTemplate.expire(key,LOGIN_USER_TOKEN_TTL, TimeUnit.MINUTES);
return true;
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserHolder.removeUser();
总结:
在使用Redis替换session的时候,需要考虑的问题:
1:选择合适的数据结构
2:选择合适的key
3:选择合适的存储粒度
 
大家好,我是凯哥JAVA(kaigejava),乐于分享技术文章,欢迎大家关注“凯哥Java”,及时了解更多 。让我们一起学Java 。也欢迎大家有事没事就来和凯哥聊聊~~~




推荐阅读