Java 服务端 Token 实现指南
作为一名经验丰富的开发者,我很高兴能够帮助刚入行的小白了解如何在 Java 服务端实现 Token。Token 是一种常见的身份验证机制,它允许服务端在不存储用户密码的情况下验证用户身份。以下是实现 Java 服务端 Token 的详细步骤和代码示例。
流程图
首先,让我们通过一个流程图来了解整个实现过程:
flowchart TD
A[开始] --> B[用户登录]
B --> C[验证用户信息]
C --> D{验证成功?}
D -- 是 --> E[生成 Token]
D -- 否 --> F[返回错误信息]
E --> G[将 Token 发送给客户端]
G --> H[客户端存储 Token]
H --> I[客户端请求受保护资源]
I --> J[服务端验证 Token]
J --> K{验证成功?}
K -- 是 --> L[返回受保护资源]
K -- 否 --> M[返回错误信息]
L --> N[结束]
M --> N
步骤和代码实现
1. 用户登录
用户登录是实现 Token 的第一步。我们需要创建一个登录接口,接收用户名和密码,然后验证用户信息。
@PostMapping("/login")
public ResponseEntity<?> loginUser(@RequestBody LoginRequest loginRequest) {
User user = userService.validateUser(loginRequest.getUsername(), loginRequest.getPassword());
if (user != null) {
String token = generateToken(user);
return ResponseEntity.ok(new LoginResponse(token));
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password");
}
}
2. 验证用户信息
在这一步,我们需要验证用户输入的用户名和密码是否正确。这通常涉及到查询数据库。
public User validateUser(String username, String password) {
return userRepository.findByUsernameAndPassword(username, password);
}
3. 生成 Token
如果用户验证成功,我们需要生成一个 Token。这里我们可以使用 JWT(JSON Web Tokens)来实现。
private String generateToken(User user) {
String token = Jwts.builder()
.setSubject(user.getUsername())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000)) // 1 hour expiration
.signWith(SignatureAlgorithm.HS256, "secretKey")
.compact();
return token;
}
4. 将 Token 发送给客户端
生成 Token 后,我们需要将其发送给客户端。这通常通过响应体完成。
public class LoginResponse {
private String token;
public LoginResponse(String token) {
this.token = token;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
}
5. 客户端存储 Token
客户端收到 Token 后,需要将其存储在本地,以便后续请求使用。
6. 客户端请求受保护资源
当客户端需要访问受保护的资源时,它需要在请求头中包含 Token。
GET /protected HTTP/1.1
Host: example.com
Authorization: Bearer <token>
7. 服务端验证 Token
服务端接收到请求后,需要验证请求头中的 Token 是否有效。
@PreAuthorize("hasAuthority('SCOPE_USER')")
public ResponseEntity<?> getProtectedResource() {
return ResponseEntity.ok("This is a protected resource");
}
类图
以下是实现 Token 所需的类图:
classDiagram
class LoginRequest {
<<interface>> Serializable
+String getUsername()
+String getPassword()
}
class LoginResponse {
+String getToken()
}
class User {
+String getUsername()
+String getPassword()
}
class UserService {
+User validateUser(String username, String password)
}
class UserRepository {
+User findByUsernameAndPassword(String username, String password)
}
结尾
通过以上步骤和代码示例,你应该对如何在 Java 服务端实现 Token 有了更清晰的了解。记住,安全是最重要的,确保你的 Token 生成和验证机制是安全的。祝你在开发过程中一切顺利!