java jwt 库_Java的JJWT实现JWT

1,什么是JJWT

JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache License,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。

2,JJWT快速入门

2.1,token的创建

创建Maven工程,引入依赖

io.jsonwebtoken

jjwt

0.6.0

创建类CreateJwtTest,用于生成token

public class CreateJwtTest {

public static void main(String[] args) {

JwtBuilder builder= Jwts.builder().setId("888") .setSubject("小白")

.setIssuedAt(new Date())//设置签发时间

.signWith(SignatureAlgorithm.HS256,"xiaocai");//设置签名秘钥

System.out.println( builder.compact() );

}

}

3.测试运行,输出如下

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1MjM0MTM0NTh9.gq0JcOM_qCNqU_sd_IrRytaNenesPmqAIhQpYXHZk

再次运行,会发现每次运行的结果是不一样的,因为我们的载荷中包含了时间。

2.2,Token的解析

我们刚才已经创建了token ,在web应用中这个操作是由服务端进行然后发给客户端,客户端在下次向服务端发送请求时需要携带这个token(这就好像是拿着一张门票一样),那服务端接到这个token应该解析出token中的信息(例如用户id),根据这些信息查询数据库返回相应的结果。

创建ParseJwtTest

public class ParseJwtTest {

public static void main(String[] args) {

String

token="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiO

jE1MjM0MTM0NTh9.gq0J‐cOM_qCNqU_s‐d_IrRytaNenesPmqAIhQpYXHZk";

Claims claims =

Jwts.parser().setSigningKey("xiaocai").parseClaimsJws(token).getBody();

System.out.println("id:"+claims.getId());

System.out.println("subject:"+claims.getSubject());

System.out.println("IssuedAt:"+claims.getIssuedAt());

}

}

试着将token或签名秘钥篡改一下,会发现运行时就会报错,所以解析token也就是验证 token

2.3 token过期校验

很多时候,我们并不希望签发的token是永久生效的,所以我们可以为token添加一个过期时间。

创建CreateJwtTest2

public class CreateJwtTest2 {

public static void main(String[] args) {

//为了方便测试,我们将过期时间设置为1分钟

long now = System.currentTimeMillis();//当前时间

long exp = now + 1000*60;//过期时间为1分钟

JwtBuilder builder= Jwts.builder().setId("888")

.setSubject("小白")

.setIssuedAt(new Date())

.signWith(SignatureAlgorithm.HS256,"xiaocai")

.setExpiration(new Date(exp));//设置过期时间

System.out.println( builder.compact() );

}

}

修改ParseJwtTest

public class ParseJwtTest {

public static void main(String[] args) {

String compactJws="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1MjM0MTY1NjksImV4cCI6MTUyMzQxNjYyOX0.Tk91b6mvyjpKcldkic8DgXz0zsPFF

nRgTgkgcAsa9cc";

Claims claims = Jwts.parser()

.setSigningKey("xiaocai")

.parseClaimsJws(compactJws).getBody();

System.out.println("id:"+claims.getId());

System.out.println("subject:"+claims.getSubject());

SimpleDateFormat sdf=new SimpleDateFormat("yyyy‐MM‐dd hh:mm:ss");

System.out.println("签发时间:"+sdf.format(claims.getIssuedAt()));

System.out.println("过期时间:"+sdf.format(claims.getExpiration()));

System.out.println("当前时间:"+sdf.format(new Date()) );

}

}

测试运行,当未过期时可以正常读取,当过期时会引发 io.jsonwebtoken.ExpiredJwtException异常。

Exception in thread "main" io.jsonwebtoken.ExpiredJwtException: JWT

expired at 2018‐06‐08T21:44:55+0800. Current time: 2018‐06‐08T21:44:56+0800

2.4 自定义claims

刚才的例子只是存储了id和subject两个信息,如果你想存储更多的信息(例如角色)可以定义自定义claims

创建CreateJwtTest3

public class CreateJwtTest3 {

public static void main(String[] args) {

//为了方便测试,我们将过期时间设置为1分钟

long now = System.currentTimeMillis();//当前时间

long exp = now + 1000*60;//过期时间为1分钟

JwtBuilder builder= Jwts.builder().setId("888")

.setSubject("小白")

.setIssuedAt(new Date()) .signWith(SignatureAlgorithm.HS256,"xiaocai") .setExpiration(new Date(exp)) .claim("roles","admin") .claim("logo","logo.png");

System.out.println( builder.compact() );

}

}

修改ParseJwtTest

public class ParseJwtTest {

public static void main(String[] args) {

String

compactJws="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJp

YXQiOjE1MjM0MTczMjMsImV4cCI6MTUyMzQxNzM4Mywicm9sZXMiOiJhZG1pbiIsImxvZ28iO

iJsb2dvLnBuZyJ9.b11p4g4rE94rqFhcfzdJTPCORikqP_1zJ1MP8KihYTQ";

Claims claims =

Jwts.parser().setSigningKey("xiaocai").parseClaimsJws(compactJws).getBody();

System.out.println("id:"+claims.getId());

System.out.println("subject:"+claims.getSubject());

System.out.println("roles:"+claims.get("roles"));

System.out.println("logo:"+claims.get("logo"));

SimpleDateFormat sdf=new SimpleDateFormat("yyyy‐MM‐dd hh:mm:ss");

System.out.println("签发时间:"+sdf.format(claims.getIssuedAt()));

System.out.println("过期时 间:"+sdf.format(claims.getExpiration()));

System.out.println("当前时间:"+sdf.format(new Date()) );

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值