JWT,即JSON Web Token,是一个开放标准(RFC 7519),用于在网络应用间传递信息。
具体来说,JWT是为了在分布式环境中进行安全信息传输而设计的,它通常被用来在身份提供者和服务提供者之间传递认证的用户身份信息。以下是关于JWT的一些关键点:
- 结构:一个JWT实际上就是一个字符串,通常由三部分组成,分别是头部(Header)、有效载荷(Payload)和签名(Signature)。头部通常包含类型(JWT)和签名算法(如HMAC SHA256或RSA)的信息。有效载荷则包含声明,这些声明是关于实体(通常是用户)和其他数据的信息。签名是对头部和有效载荷的加密,以确保消息在传输过程中不被篡改。
- 用途:JWT常用于单点登录(SSO)场景,以及在微服务架构中进行服务之间的安全通信。由于JWT是自包含的,这意味着它可以在不需要查询数据库的情况下验证用户身份,从而提高了系统的可伸缩性和响应速度。
- 安全性:JWT可以通过数字签名来确保其完整性和真实性,这样接收方可以验证发送方的身份以及消息是否被篡改。此外,还可以使用加密的方式来增加安全性,使得只有知道密钥的接收方才能解读token的内容。
- 优势:与传统的基于服务器的认证方式相比,JWT提供了一种无状态的认证机制,这意味着服务器不需要存储会话信息,从而减少了服务器的资源消耗。同时,由于JWT是无状态的,它也更容易实现跨域认证和授权。
一、代码实现
1、创建一个maven项目
我是创建maven项目
2、导包
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
3、创建 一个jwt工具类
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
/**
* @Author: xhj
* @Date: 2023/10/19/21:13
* @Description:
*/
public class JwtUtil {
/**
* 定义过期时间
*/
private static final long EXPIRATION_TIME = 86400000L;
/**
* 生成token
* @param subject
* @return
*/
public static String generateToken(String subject,String secretKey){ //secretKey 密钥
return Jwts.builder()
.setSubject(subject) //表示JWT的主题,通常用于标识请求的发起者或用户
.setIssuedAt(new Date()) //设置JWT的发行时间为当前时间
.setExpiration(new Date(System.currentTimeMillis()+EXPIRATION_TIME)) //设置JWT的过期时间为当前时间加上预定义的EXPIRATION_TIME
.signWith(SignatureAlgorithm.HS512,secretKey) //使用HS512算法和传入的secretKey对JWT进行签名,以确保其安全性
.compact(); //将JWT对象转换为紧凑的字符串表示形式
}
/**
* 解析token,获取用户名
* @param token
* @return
*/
public static String getSubjectFromToken(String token,String secretKey){
Claims claims = Jwts.parser()
.setSigningKey(secretKey) //secretKey 密钥
.parseClaimsJws(token) //生成的token
.getBody();
return claims.getSubject();
}
}
4、创建一个main方法
public static void main(String[] args) {
String token = generateToken("xhj", "zhangxinbao");
// 生成token
System.out.println(token);
// 获取用户名
System.out.println(getSubjectFromToken(token,"zhangxinbao"));
}