token 缓存 cookie 登录案例
在Spring Boot中实现一次性token通常涉及以下步骤:
-
生成Token:当用户首次登录时,生成一个唯一的token,并将其存储在服务器端,比如数据库或内存缓存中。
-
发送Token:将生成的token发送给客户端,可以通过响应体、响应头或者重定向URL的参数等方式。
-
验证Token:当客户端使用token请求服务器时,服务器需要验证token的有效性。如果token有效,服务器将执行相应的操作(比如登录用户)。
-
Token失效:一旦token被使用,服务器需要立即使其失效,确保它不能被再次使用。
-
设置Cookie:在token验证通过后,服务器可以生成一个session或者其他形式的cookie,发送给客户端用于后续的自动登录。
下面是一个简化的示例流程:
@RestController
@RequestMapping("/auth")
public class AuthController {
private final TokenService tokenService;
private final UserService userService;
// 构造器注入服务
public AuthController(TokenService tokenService, UserService userService) {
this.tokenService = tokenService;
this.userService = userService;
}
// 登录接口,生成一次性token
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest, HttpServletResponse response) {
// 验证用户凭证
User user = userService.validateUser(loginRequest.getUsername(), loginRequest.getPassword());
if (user != null) {
// 生成token
String token = tokenService.createToken(user);
// 发送token给客户端
return ResponseEntity.ok().body(Collections.singletonMap("token", token));
}
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
// 使用token自动登录接口
@GetMapping("/auto-login")
public ResponseEntity<?> autoLogin(@RequestParam("token") String token, HttpServletResponse response) {
// 验证token
if (tokenService.validateToken(token)) {
// token验证成功,获取用户信息
User user = tokenService.getUserFromToken(token);
// 设置cookie
Cookie cookie = new Cookie("SESSIONID", userService.createSession(user));
response.addCookie(cookie);
// 使token失效
tokenService.invalidateToken(token);
// 返回成功响应
return ResponseEntity.ok().build();
}
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
}
在上面的代码中,TokenService
负责创建、验证和使token失效的逻辑,而UserService
负责用户的验证和session的创建。这只是一个示例,实际的实现可能会涉及更多的安全考虑,比如token的加密、存储和过期策略等。
请注意,这个示例没有包含所有的细节,比如异常处理、日志记录、安全性增强等。在实际应用中,你可能需要使用Spring Security或其他安全框架来帮助你更安全、更方便地实现这些功能。