一、什么是JWT?
Header:头部,通常包含两部分内容——签名算法和令牌类型(如JWT)。 Payload:有效载荷,包含了你需要传递的信息(比如用户ID,权限等),通常是一些JSON格式的键值对。 Signature:签名部分,主要是为了验证数据的完整性和验证发送者的身份。签名是通过Header和Payload一起,使用服务器端的私钥进行加密生成的。
Header.Payload.Signature
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
二、JWT的优势
无状态:JWT是无状态的,也就是说,你不需要在服务器端存储用户的会话信息。每个请求中,JWT都包含了用户的身份信息,服务器只需要验证JWT的合法性,判断是否被篡改。 跨域认证:传统的Cookie认证只能在同源的情况下工作,而JWT是跨域的。只要JWT是通过HTTPS发送的,它可以在多个域名之间共享,这对于分布式应用、微服务架构等场景非常有用。 灵活性高:JWT的有效载荷部分,你可以随意携带任何你需要的信息。它不仅仅用于认证,还可以用于授权、数据交换等。 轻量高效:由于JWT是纯文本格式(JSON),它非常轻量,而且编码后的JWT也很短。这样在网络传输中就很高效。
JWT是自包含的,但这也意味着JWT的有效载荷中如果包含了敏感信息,必须要小心。因为JWT虽然是经过签名的,但它本身并没有加密,所以其中的内容是可以被解码出来的。 JWT的过期时间问题。一旦JWT过期,就需要重新登录。如果设计不当,可能会造成过期时间过短或者过长的问题。
三、Java-JWT库
四、使用Java-JWT生成JWT
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.18.2</version> <!-- 请根据需要使用合适版本 -->
</dependency>
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Date;
public class JwtExample {
public static String createJWT(String userId) {
// 使用HS256算法,设置密钥
Algorithm algorithm = Algorithm.HMAC256("secret");
// 设置JWT的过期时间为1小时
Date now = new Date();
Date expiryDate = new Date(now.getTime() + 3600000); // 1小时后过期
// 创建JWT
String token = JWT.create()
.withIssuer("myApp")
.withSubject(userId)
.withIssuedAt(now)
.withExpiresAt(expiryDate)
.sign(algorithm);
return token;
}
public static void main(String[] args) {
String userId = "123456";
String token = createJWT(userId);
System.out.println("生成的JWT是: " + token);
}
}
"secret"
)生成签名。生成的JWT是: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTYiLCJpc3MiOiJteUFwcCIsImlhdCI6MTYzMjM2NzI0MiwiZXhwIjoxNjMyMzY3MjcwfQ.sO_M_JYy-G6NEcPTpvxj9Fe1N6Os00jc5hbMy_pJH9k
五、验证JWT
import com.auth0.jwt.JWT;
import com.auth0.jwt.exceptions.JWTVerificationException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
public class JwtVerifyExample {
public static void verifyJWT(String token) {
try {
// 创建HMAC256算法对象
Algorithm algorithm = Algorithm.HMAC256("secret");
// 创建JWTVerifier
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer("myApp")
.build();
// 验证JWT
DecodedJWT decodedJWT = verifier.verify(token);
// 打印JWT信息
System.out.println("用户ID: " + decodedJWT.getSubject());
System.out.println("签发时间: " + decodedJWT.getIssuedAt());
System.out.println("过期时间: " + decodedJWT.getExpiresAt());
} catch (JWTVerificationException exception) {
// 验证失败,打印错误信息
System.out.println("JWT验证失败: " + exception.getMessage());
}
}
public static void main(String[] args) {
String token = "从上面的生成代码获取的JWT";
verifyJWT(token);
}
}
六、总结
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。