什么是JWT
JSON Web Token 通过数字签名的方式,以json对象为载体,在不同服务中端之间安全的传递信息。
JWT作用
JWT最常见的场景是授权登录,一旦用户登录,后续每个请求都将包含JWT,系统在每次处理用户请求之前,都会先进行JWT安全验证,通过之后再进行处理,例如公司进出时的工牌
JWT的组成
JWT总共由三部分组成,并用.拼接
例如
sakakhvhhjasvx5as6xsaxxs51a6.xasyjxsvaxsa6545sx6asxbahvxshsx1a+saxsxnsxhsaxsx5sa64asxsahxyusaxvsaxxsa994xas9xsaa.xsakyasxxsatxyaafxyaas19x9asxudassx
这三部分分别是:
● Header
{ 'typ': 'JWT' 'alg': 'HS256' }
● Payload载荷,重复有效信息
{ 'sub': '1356585' 'name': "asxkbkhxas" }
● Signature签名
var encodedString = base64UrlEncode(header)+'.'+base64UrlEncode(payload); var signature = HMACSHA256(encodeString, 'secret')
使用方法
首先引入依赖
jdk1.8
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version> </dependency>
如果是jdk1.8版本以上
还需要加入jaxb-impl,jaxb-core,jaxb-api依赖
加密
JwtBuilder builder = Jwts.builder(); String jwtToken = builder //header .setHeaderParam("typ","Jwt") .setHeaderParam("alg","HS256") //patLoad .claim("username","tom") .claim("role","admain") .setSubject("admin-test")//主题 .setExpiration(new Date(System.currentTimeMillis()+200000))//设置有效期要放在一个Data构造器中,并获得系统当前时间并加上持续的时间 .setId(UUID.randomUUID().toString()) //signature .signWith(SignatureAlgorithm.HS256,"xsaasx")//设置签名 //将这三部分用.拼接起来 .compact(); System.out.println(jwtToken);
解密
JwtParser parser = Jwts.parser(); Jws<Claims> xsaasx = parser.setSigningKey("xsaasx").parseClaimsJws(token);//解密中的setSigningKey参数必须和加密中设置的签名一致 Claims body = xsaasx.getBody(); System.out.println(body.get("username")); System.out.println(body.get("role"));
总代码
import io.jsonwebtoken.*;
import java.util.Date;
import java.util.UUID;
public class test {
public static String addJwt(){
JwtBuilder builder = Jwts.builder();
String jwtToken = builder
//header
.setHeaderParam("typ","Jwt")
.setHeaderParam("alg","HS256")
//patLoad
.claim("username","tom")
.claim("role","admain")
.setSubject("admin-test")//主题
.setExpiration(new Date(System.currentTimeMillis()+200000))//设置有效期要放在一个Data构造器中,并获得系统当前时间并加上持续的时间
.setId(UUID.randomUUID().toString())
//signature
.signWith(SignatureAlgorithm.HS256,"xsaasx")//设置签名
//将这三部分用.拼接起来
.compact();
System.out.println(jwtToken);
return jwtToken;
}
public static void closeJwt(String token){
JwtParser parser = Jwts.parser();
Jws<Claims> xsaasx = parser.setSigningKey("xsaasx").parseClaimsJws(token);
Claims body = xsaasx.getBody();
System.out.println(body.get("username"));
System.out.println(body.get("role"));
}
public static void main(String[] args) {
closeJwt(addJwt());
}
}