黑马点评项目的登出操作

977 词

基于session完成登录时如何登出

@Controller

1
2
3
4
5
6
7
@PostMapping("/logout")
public Result logout(HttpSession session){
log.info("登出");
session.invalidate(); //使当前客户端的session无效化
userService.logout();
return Result.ok();
}

@Service

1
2
3
public void logout(HttpHeaders headers) {
UserHolder.removeUser(); //清空TreadLocal的数据
}

基于Redis完成登录时登出

@Controller

1
2
3
4
5
6
@PostMapping("/logout")
public Result logout(@RequestHeader HttpHeaders headers){
log.info("登出");
userService.logout(headers);
return Result.ok();
}

@Service

1
2
3
4
5
public void logout(HttpHeaders headers) {
String key = RedisConstants.LOGIN_USER_KEY + headers.getFirst(HeaderConstants.TOKEN);
stringRedisTemplate.delete(key); //清空redis中当前用户的缓存
UserHolder.removeUser();
}

一些注意事项

  • 因为redis当中是把用户的token作为key来存储的,而TreadLocal中并没有存储这一信息,所以需要在Controller中或许header来拿到token(或者考虑在TreadLocal中存储token)
  • stringRedisTemplate.delete(key)不能用stringRedisTemplate.opsForHash().delete(key),因为后者必须指定hash key,从而删除该hash中的一个或多个数据,而不能直接删除整个hash