在软件使用上,用户体验是一个重要的考虑因素,所以为了提高用户的体验,很多的应用系统中都会有自动登录功能,如下所示的自动登录的图:

自动登录其实是在用户第一次成功登录后,应用系统将用户的登录状态持久化,等用户下次再访问时实现自动登录,这样就不需用户再次输入用户名和密码。那么自动登录如何实现呢,下面介绍通过Cookie+Token的方式实现自动登录的功能。
1、Cookie+Token实现方案
用户勾选“自动登录”选项后进行登录时,服务端验证用户信息通过之后生成一个Token,然后服务端将Token写到Cookie上并存留一段时间,用户下次重新打开浏览器,浏览器会自动登录,如下自动登录的流程图:

(1)当用户第一次登录系统的时候,用户输入用户名和密码进行登录,验证账号与密码通过之后,服务端生成Token,如下图所示:

服务端将生成的Token缓存一份到Redis上,然后将Token和用户信息更新到数据库中;最后服务端将Token存入用户的Cookie中,以便后续请求使用。
(2)用户下次再访问服务的时候,请求中携带有Token的Cookie访问服务端,服务端要从请求的Cookie中获取Token的信息,流程图如下所示:

Redis中与数据库中都验证Token通过之后,系统直接将用户设置成登录状态。至此就完成了用户的自动登录。
2、方案实现的核心代码
(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 "用户名或密码错误";
}
}
(2)用户自动登录的核心代码实现
@GetMapping("/autoLogin")
public String autoLogin(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
if (Objects.isNull(cookies)) {
return "自动登录失败";
}
for (Cookie cookie : cookies) {
if ("token".equals(cookie.getName())) {
String token = cookie.getValue();
if(stringRedisTemplate.opsForValue().get("login_token_" + token) == null){
return "自动登录失败";
}
String userIdStr = JWTUtils.parseToken(token);
User user = userService.queryByToken(token);
if (Objects.nonNull(user) && user.getId().toString().equals(userIdStr)) {
return "自动登录成功了";
} else {
return "自动登录失败";
}
}
}
return "自动登录失败";
}
总结:
通过使用Token和Cookie的方式已实现了用户自动登录功能。原理是用户第一次登录成功之后将Token保存到Cookie中,然后用户再次登录时检测Token是否有效,从而实现自动登录的功能。
优网科技,优秀企业首选的互联网供应服务商
优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!
优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、DIY体验、720全景展厅及3D虚拟仿真)、移动端应用(手机站、APP开发)、微信定制开发(微信官网、微信商城、企业微信)、微信小程序定制开发等一系列互联网应用服务。