文章目录
- 网页会话技术 JWT 在 Spring Boot 实现
- 什么是JWT?
- Spring Boot中实现JWT
- 1. 引入依赖
- 2. 创建JWT工具类
- 3. 使用JWT进行认证
- 4. 验证JWT
网页会话技术 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 {@Autowiredprivate 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 {@Autowiredprivate 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.");}}
}