接上篇token校驗(yàn),現(xiàn)在實(shí)現(xiàn)一下退出登錄的功能
Controller層
@PostMapping("/logout")
public Result logout(){
return LoginService.logout();
}
Service層
退出登錄的本質(zhì)就是要?jiǎng)h除redis中緩存的用戶信息,因?yàn)檎{(diào)接口就必須攜帶token,就會(huì)走認(rèn)證過(guò)濾器的流程,如果redis中沒(méi)有對(duì)應(yīng)的用戶信息,那么token就是無(wú)效的。
我們要獲取userId,然后根據(jù)userId刪除redis中的緩存,那么就用SecurityContextHolder來(lái)獲取userId。 SecurityContextHolder底層是用ThreadLocal實(shí)現(xiàn)的,也就說(shuō)明同一個(gè)線程里都可以訪問(wèn)到之前在過(guò)濾器里面存儲(chǔ)到SecurityContextHolder里的用戶對(duì)象。
@Override
public Result logout() {
//1、獲取token,解析出userId
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
LoginUser loginUser = (LoginUser) authentication.getPrincipal(); //強(qiáng)轉(zhuǎn)
Long userId = loginUser.getUser().getId();
//2、刪除redis中緩存的用戶信息
redisCache.deleteObject("login:"+userId);
return Result.okResult();
}