报错:
[2021/02/02-10:05:39] [http-nio-8080-exec-8] [ERROR] [org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet]] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: JWT String argument cannot be null or empty.] with root cause
java.lang.IllegalArgumentException: JWT String argument cannot be null or empty.
这是TestController里面的源码:
@Autowired
private CommentDao commentDao;
@PostMapping("/comment")
public ResponseResult testComment(@RequestBody Comment comment, HttpServletRequest request){
String content = comment.getContent();
log.info("comment content == > " + content);
//还有得知评论的是谁,对这个评论,身份进行确定
String tokenKey = getCookie(Constants.User.COOKIE_TOKE_KEY, request);
if(tokenKey == null){
return ResponseResult.FAILED("账号未登录");
}
String token = (String) redisUtils.get(Constants.User.KEY_TOKEN + tokenKey);
if (token == null) {
//为空就是过期了,但是可能登陆过了,可以去查refreshToken
//如果refreTokem不存在或者已经过期
//告诉用户账号未登录
}
//已经登录过,解析token
Claims claims = JwtUtil.parseJWT(token);
String userId = (String) claims.get("id");
comment.setUserId(userId);
String avatar = (String) claims.get("avatar");
comment.setUserAvatar(avatar);
String userName = (String) claims.get("userName");
comment.setUserName(userName);
comment.setCreateTime(new Date());
comment.setUpdateTime(new Date());
comment.setId(idWorker.nextId() + "");
commentDao.save(comment);
return ResponseResult.SUCCESS("评论成功!");
}
这是JwtUtil里面的源码:
/**
* @param claims 载荷内容
* @param ttl 有效时长
* @return
*/
public static String createToken(Map<String, Object> claims, long ttl) {
JwtUtil.ttl = ttl;
return createToken(claims);
}
public static String createRefreshToken(String userId, long ttl) {
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
JwtBuilder builder = Jwts.builder().setId(userId)
.setIssuedAt(now)
.signWith(SignatureAlgorithm.HS256, key);
if (ttl > 0) {
builder.setExpiration(new Date(nowMillis + ttl));
}
return builder.compact();
}
/**
* @param claims 载荷
* @return token
*/
public static String createToken(Map<String, Object> claims) {
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
JwtBuilder builder = Jwts.builder()
.setIssuedAt(now)
.signWith(SignatureAlgorithm.HS256, key);
if (claims != null) {
builder.setClaims(claims);
}
if (ttl > 0) {
builder.setExpiration(new Date(nowMillis + ttl));
}
return builder.compact();
}
public static Claims parseJWT(String jwtStr) {
return Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(jwtStr)
.getBody();
}
这个应该是你的jwtutil文件有问题了,那个盐值,也就是顶部的那个key的字符串,你只copy了文件,没有把里面的值设置成你的,所以出错了。
你看一下,改了就好了。
试试吧 打断点调试
你的问题是 jwt 不能实例化,你的源码里面
if (token == null) {
//为空就是过期了,但是可能登陆过了,可以去查refreshToken
//如果refreTokem不存在或者已经过期
//告诉用户账号未登录
}
没有加 return
能否打断点查看你的 ruquest 里是否携带了 cookie