Java JWT 统计在线用户

在Web应用程序中,统计在线用户数量是一个常见的需求。为了实现这一功能,我们可以使用JSON Web Token(JWT)来管理用户的会话状态。JWT是一种安全的认证机制,可以在用户和服务器之间传递信息,而无需在服务器端存储用户的会话状态。

本文将介绍如何使用Java编程语言和JWT来统计在线用户的数量。我们将创建一个简单的Web应用程序,使用JWT来管理用户的会话状态,并使用这些JWT来统计在线用户的数量。

什么是JWT

JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在用户和服务器之间安全地传递信息。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。JWT通常使用HMAC算法或RSA算法对信息进行加密和签名,以确保信息的安全性。

JWT的结构如下所示:

{
  "header": {
    "alg": "HS256",
    "typ": "JWT"
  },
  "payload": {
    "sub": "1234567890",
    "name": "John Doe",
    "exp": 1516239022
  },
  "signature": "HMACSHA256(base64UrlEncode(header) + '.' + base64UrlEncode(payload), secret)"
}

在JWT中,头部通常包含算法和令牌类型等信息,载荷包含实际的用户信息,签名用于验证信息的完整性和安全性。

统计在线用户

为了统计在线用户数量,我们将使用JWT来管理用户的会话状态。当用户登录时,我们将生成一个JWT并将其保存在客户端的Cookie中。在每次请求时,客户端将携带这个JWT,以验证用户的身份和会话状态。

我们将创建一个简单的Spring Boot应用程序来实现此功能。首先,我们需要添加相关的依赖:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

接下来,我们将创建一个JWTUtil类来生成和验证JWT:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JWTUtil {

    private static final String SECRET_KEY = "secret";
    private static final long EXPIRATION_TIME = 86400000; // 1 day

    public static String generateJWT(String userId) {
        Date now = new Date();
        Date expiration = new Date(now.getTime() + EXPIRATION_TIME);

        return Jwts.builder()
                .setSubject(userId)
                .setIssuedAt(now)
                .setExpiration(expiration)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    public static String getUserIdFromJWT(String jwt) {
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(jwt)
                .getBody();

        return claims.getSubject();
    }
}

在上面的代码中,我们定义了一个generateJWT方法来生成JWT,并将用户ID作为主题(Subject)信息保存在载荷中。我们还定义了一个getUserIdFromJWT方法来验证JWT,并从中获取用户ID。

接下来,我们将创建一个Controller类来处理用户登录和注销请求,并统计在线用户数量:

import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@RestController
public class AuthController {

    private static Map<String, String> onlineUsers = new HashMap<>();

    @PostMapping("/login")
    public String login(@RequestParam String userId, HttpServletResponse response) {
        String jwt = JWTUtil.generateJWT(userId);
        Cookie cookie = new Cookie("jwt", jwt);
        response.addCookie(cookie);
        onlineUsers.put(userId, jwt);
        return "Login successful!";
    }

    @GetMapping("/logout")
    public String logout(HttpServletRequest request, HttpServletResponse response) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("jwt")) {
                    String userId = JWTUtil.getUserIdFromJWT(cookie.getValue());
                    onlineUsers.remove(userId);
                    cookie.setMaxAge(0);
                    response.addCookie(cookie);
                    return "Logout successful!";
                }
            }
        }
        return "User not logged in!";
    }

    @GetMapping("/onlineUsers")
    public int getOnlineUsers() {
        return onlineUsers