在軟件使用上,用戶體驗(yàn)是一個(gè)重要的考慮因素,所以為了提高用戶的體驗(yàn),很多的應(yīng)用系統(tǒng)中都會(huì)有自動(dòng)登錄功能,如下所示的自動(dòng)登錄的圖:
?
自動(dòng)登錄其實(shí)是在用戶第一次成功登錄后,應(yīng)用系統(tǒng)將用戶的登錄狀態(tài)持久化,等用戶下次再訪問時(shí)實(shí)現(xiàn)自動(dòng)登錄,這樣就不需用戶再次輸入用戶名和密碼。那么自動(dòng)登錄如何實(shí)現(xiàn)呢,下面介紹通過Cookie+Token的方式實(shí)現(xiàn)自動(dòng)登錄的功能。
1、Cookie+Token實(shí)現(xiàn)方案
用戶勾選“自動(dòng)登錄”選項(xiàng)后進(jìn)行登錄時(shí),服務(wù)端驗(yàn)證用戶信息通過之后生成一個(gè)Token,然后服務(wù)端將Token寫到Cookie上并存留一段時(shí)間,用戶下次重新打開瀏覽器,瀏覽器會(huì)自動(dòng)登錄,如下自動(dòng)登錄的流程圖:
(1)當(dāng)用戶第一次登錄系統(tǒng)的時(shí)候,用戶輸入用戶名和密碼進(jìn)行登錄,驗(yàn)證賬號(hào)與密碼通過之后,服務(wù)端生成Token,如下圖所示:
服務(wù)端將生成的Token緩存一份到Redis上,然后將Token和用戶信息更新到數(shù)據(jù)庫中;最后服務(wù)端將Token存入用戶的Cookie中,以便后續(xù)請求使用。
(2)用戶下次再訪問服務(wù)的時(shí)候,請求中攜帶有Token的Cookie訪問服務(wù)端,服務(wù)端要從請求的Cookie中獲取Token的信息,流程圖如下所示:
Redis中與數(shù)據(jù)庫中都驗(yàn)證Token通過之后,系統(tǒng)直接將用戶設(shè)置成登錄狀態(tài)。至此就完成了用戶的自動(dòng)登錄。
2、方案實(shí)現(xiàn)的核心代碼
(1)用戶的登錄的核心代碼
@PostMapping("/login")
public String login(@RequestBody User loginUser, HttpServletResponse response) {
User user = userService.queryUserByName(loginUser.getUsername());
if (user != null && user.getPassword().equals(loginUser.getPassword())) {
String token = JWTUtils.generateToken(user);
user.setToken(token);
userService.save(user);
stringRedisTemplate.opsForValue().set("login_token_" + token, user.getId().toString(), 7 * 24 * 60 * 60, TimeUnit.SECONDS);
Cookie cookie = new Cookie("token", token);
cookie.setPath("/");
cookie.setMaxAge(7 * 24 * 60 * 60);
response.addCookie(cookie);
return "登錄成功";
} else {
return "用戶名或密碼錯(cuò)誤";
}
}
(2)用戶自動(dòng)登錄的核心代碼實(shí)現(xiàn)
@GetMapping("/autoLogin")
public String autoLogin(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
if (Objects.isNull(cookies)) {
return "自動(dòng)登錄失敗";
}
for (Cookie cookie : cookies) {
if ("token".equals(cookie.getName())) {
String token = cookie.getValue();
if(stringRedisTemplate.opsForValue().get("login_token_" + token) == null){
return "自動(dòng)登錄失敗";
}
String userIdStr = JWTUtils.parseToken(token);
User user = userService.queryByToken(token);
if (Objects.nonNull(user) && user.getId().toString().equals(userIdStr)) {
return "自動(dòng)登錄成功了";
} else {
return "自動(dòng)登錄失敗";
}
}
}
return "自動(dòng)登錄失敗";
}
總結(jié):
通過使用Token和Cookie的方式已實(shí)現(xiàn)了用戶自動(dòng)登錄功能。原理是用戶第一次登錄成功之后將Token保存到Cookie中,然后用戶再次登錄時(shí)檢測Token是否有效,從而實(shí)現(xiàn)自動(dòng)登錄的功能。
該文章在 2025/1/23 10:47:00 編輯過