JWT的简单应用

1. 添加依赖

首先,在你的pom.xml中添加java-jwt库的依赖项:

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.0.0</version>
</dependency>

2. JWT工具类

创建一个JwtUtil工具类,用于生成和验证JWT。这个类还会包括对JWT的一些配置,如密钥、有效期等。

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;

import java.util.Date;

public class JwtUtil {

    // 秘钥,应该保密
    private static final String SECRET_KEY = "your_secret_key";

    // JWT的过期时间(单位:毫秒),这里设置为10分钟
    private static final long EXPIRATION_TIME = 10 * 60 * 1000;

    // 生成JWT
    public static String generateToken(String username) {
        return JWT.create()
                .withSubject(username) // 设置主题为用户名
                .withIssuedAt(new Date()) // 设置签发时间
                .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置过期时间
                .sign(Algorithm.HMAC256(SECRET_KEY)); // 使用HMAC256算法签名
    }

    // 验证JWT
    public static DecodedJWT verifyToken(String token) throws JWTVerificationException {
        JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SECRET_KEY))
                .build(); // 创建验证器
        return verifier.verify(token); // 验证JWT并返回解码后的JWT
    }

    // 从JWT中提取用户名
    public static String getUsernameFromToken(String token) {
        DecodedJWT jwt = verifyToken(token);
        return jwt.getSubject(); // 获取主题部分,也就是用户名
    }
}

3. 用户登录与JWT生成

在用户成功登录后,生成并返回JWT。这里以一个模拟的用户服务类为例:

public class UserService {

    // 模拟的用户数据存储
    private static final Map<String, String> users = new HashMap<>();

    static {
        users.put("user1", "password1");
        users.put("user2", "password2");
    }

    // 登录方法
    public String login(String username, String password) {
        // 验证用户名和密码是否正确
        if (isValidUser(username, password)) {
            // 如果验证通过,生成JWT
            return JwtUtil.generateToken(username);
        } else {
            // 如果用户名或密码错误,抛出异常
            throw new RuntimeException("Invalid username or password");
        }
    }

    // 验证用户方法
    private boolean isValidUser(String username, String password) {
        return users.containsKey(username) && users.get(username).equals(password);
    }
}

4. 保护受限资源

现在假设有一个受限的资源,只有在提供有效的JWT时才可以访问。我们可以通过拦截器或过滤器来验证每个请求中的JWT。

public class ProtectedResource {

    public void accessResource(String token) {
        try {
            // 验证JWT
            String username = JwtUtil.getUsernameFromToken(token);
            System.out.println("Access granted to user: " + username);
            // 执行受限操作
        } catch (JWTVerificationException exception) {
            // 如果JWT无效或过期,抛出异常
            throw new RuntimeException("Invalid or expired token");
        }
    }
}

5. 示例应用

最后,假设你有一个主程序,它模拟了用户登录和访问受限资源的过程。

public class MainApplication {
    public static void main(String[] args) {
        UserService userService = new UserService();
        ProtectedResource protectedResource = new ProtectedResource();

        // 用户登录并获取JWT
        String token = userService.login("user1", "password1");
        System.out.println("Generated JWT: " + token);

        // 使用JWT访问受限资源
        protectedResource.accessResource(token);
    }
}

关键点总结

  1. JWT生成JwtUtil.generateToken(String username)生成JWT,包含了用户的标识和有效期。
  2. JWT验证JwtUtil.verifyToken(String token)验证JWT的有效性,包括密钥匹配和过期检查。
  3. 应用场景:通过登录获取JWT,并在每次请求受限资源时携带JWT,以便服务器验证并确定权限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿时光不负.

爱意随风起,风止意难平。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值