网页会话技术 JWT 在 Spring Boot 实现
什么是JWT?
JWT是一种紧凑且自包含的方式,用于在各方之间安全地传输信息。它可以包含用户的身份信息以及其他相关信息,如权限和有效期。JWT的结构通常由三部分组成:Header(头部)、Payload(负载)和Signature(签名)。
- Header(头部) 包含了令牌的元数据,如令牌的类型和使用的签名算法。
- Payload(负载) 包含了实际的数据,如用户ID、用户名和过期时间。
- Signature(签名) 是对Header和Payload的签名,用于验证令牌的真实性和完整性。
Spring Boot中实现JWT
1. 引入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
2. 创建JWT工具类
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class JwtUtils {
private final String secret = "your-secret-key";
public String generateToken(String username) {
Date now = new Date();
Date expiration = new Date(now.getTime() + 86400000); // 24小时后过期
return Jwts.builder()
.setSubject(username)
.setIssuedAt(now)
.setExpiration(expiration)
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
public String getUsernameFromToken(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
return claims.getSubject();
}
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
}
3. 使用JWT进行认证
@RestController
@RequestMapping("/auth")
public class AuthController {
@Autowired
private JwtUtils jwtUtils;
@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody LoginRequest loginRequest) {
// 根据用户名和密码进行认证,如果认证成功,生成JWT并返回给客户端
String token = jwtUtils.generateToken(loginRequest.getUsername());
return ResponseEntity.ok(token);
}
}
4. 验证JWT
@RestController
@RequestMapping("/secure")
public class SecureController {
@Autowired
private JwtUtils jwtUtils;
@GetMapping("/data")
public ResponseEntity<String> secureData(@RequestHeader("Authorization") String authHeader) {
String token = authHeader.substring(7); // 剥离Bearer前缀
if (jwtUtils.validateToken(token)) {
String username = jwtUtils.getUsernameFromToken(token);
// 根据用户名获取受保护的数据
// 返回受保护数据
return ResponseEntity.ok("Welcome, " + username + "! This is secure data.");
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid token.");
}
}
}