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