【网页会话技术jwt在springboot实现】

文章目录

  • 网页会话技术 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.jsonwebtokengroupId>
    <artifactId>jjwt-apiartifactId>
    <version>0.11.2version>
dependency>
<dependency>
    <groupId>io.jsonwebtokengroupId>
    <artifactId>jjwt-implartifactId>
    <version>0.11.2version>
    <scope>runtimescope>
dependency>
<dependency>
    <groupId>io.jsonwebtokengroupId>
    <artifactId>jjwt-jacksonartifactId>
    <version>0.11.2version>
    <scope>runtimescope>
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.");
        }
    }
}

你可能感兴趣的:(前后端,spring,boot,python,后端)