因为JWT是无状态的,去中心化的,在服务器端无法清除,服务器一旦进行颁发,就只能等待自动过期 才会失效,所以需要redis配合才能完成登录状态的记录。
实现思路: 登录后在redis中添加一个白名单,把认证成功的用户的JWT添加到redis中。
在退出的时候,服务清空springsecurit保存认证通过的Authentication对象,其次在redis中进行删除。
(1)改造登录接口
保存至redis时,加上截止时间。
(2)退出后台代码实现
/**
* 用户退出
*/
@PostMapping("/logout")
public R logout(HttpServletRequest request, HttpServletResponse response) {
//获取token
String token = request.getParameter("Authorization");
//如果没有从头部获取token,那么从参数里面获取
if (ObjectUtils.isEmpty(token)) {
token = request.getHeader("Authorization");
}
//获取用户相关信息
Authentication authentication
= SecurityContextHolder.getContext().getAuthentication();
if (authentication != null) {
//清空用户信息
new SecurityContextLogoutHandler().logout(request, response,authentication);
//清空redis里面的token
String key = "token_" + token;
stringRedisTemplate.delete(key);
}
return R.ok().message("用户退出成功");
}