关于从Redis中取缓存用户信息时报错ClassCastException
写在前面
因为之前没有系统的看过SpringSecurity
,而且之前在写微人事的时候没有采用JWT
的认证方式,所以最近打算把SpringSecurity
再重新看一遍,顺便熟悉一下怎么使用JWT
的认证方式(不知道为什么是重新,之前好像也没怎么看过
demo介绍
简单介绍一下,问题主要出在下面这两个地方
自定义的登录接口
调用
ProviderManager
的方法进行认证,如果认证通过生成jwt
把用户信息存入
redis
中,这里键值对中的键是"login:" + userid
,值即是用户认证信息
认证部分没什么问题就略过不放了,存入redis
核心代码如下
LoginUser loginUser = (LoginUser) authenticate.getPrincipal();
String userid = loginUser.getUser().getId().toString();
String jwt = JwtUtil.createJWT(userid);
redisCache.setCacheObject("login:" + userid, loginUser);
定义Jwt认证过滤器
获取
token
解析
token
获取其中的userid
从
redis
中获取用户信息存入
SecurityContextHolder
前面解析也不放了,这里展示从redis
读取的代码,后面存入SecurityContextHolder
也不是本文的重点
String redisKey = "login:" + userid;
LoginUser loginUser = redisCache.getCacheObject(redisKey);
看似没什么问题对吧
登录也可以正常获取token
出现了问题
在访问接口时认证过滤器报错了,报了个ClassCastException
,无法将JSNObject
转化为LoginUser
^_^
看一下redis
里存储的信息
以为是需要JSON工具来转换一下
String cacheObject = redisCache.getCacheObject(redisKey);
LoginUser loginUser = JSON.parseObject(cacheObject, LoginUser.class);
还是一样,不过这次是无法将JSNObject
转化为String
了
为什么转字符串都转不了有点辣鸡^_^
然后查了一下,存储到redis
时,要转换为json
字符串进行存储??
于是将之前直接存入的对象先转换为了json
redisCache.setCacheObject("login:" + userid, JSON.toJSONString(loginUser));
成功乐
写在后面
这还没结束,后来我去研究了一下,发现有一个类叫做FastJsonRedisSerializer
,说人话就是Redis
使用FastJson
序列化,然后在RedisConfig
中也有用到
FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);
发现有一个默认的包,那么问题就出现在这了…
乐
导错包了^_^
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果