, 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共享](https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0206%2F2216c780j00rpnzy200lvc000yi00pjg.jpg&thumbnail=660x2147483647&quality=80&type=jpg)
文章插图
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 。也欢迎大家有事没事就来和凯哥聊聊~~~
推荐阅读
- 关之琳|钟镇涛70岁寿宴亮点多!关之琳紧挨前男友,叶童老公搂异性合影
- 贵池|12800余个岗位!2023春风行动之郑州名企专场招聘会等你来
- 凤凰为什么被称为百鸟之王 百鸟之王少昊读后感
- 耄耋之年指的是多少岁 耄耋之年的读音
- 雷佳音|《长安十二时辰2》将拍,雷佳音有望回归主演,疑似演绎安史之乱
- 张嘉倪|邵晴疑似回应插足张嘉倪买超婚姻,网友质疑为什么之前不出来澄清
- booking和携程哪个好,盘点两者之间的区别与差距
- 耳机排名前十的品牌有哪些,音质最好的耳机性价比之王推荐
- 小米画报有什么用小米画报关闭之后会有什么影响……小米画报有用吗?
- 香港电影|《华尔街之狼》的原型比电影还要疯狂?