简介
JSON Web Token(JWT) 是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。在Java中可以通过JJWT实现JWT创建和验证。
一、token的创建:
- (1)创建maven工程,引入依赖
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
- 创建测试方法 createJwtTest,用于生成 token
@Test
public void createJwtTest(){
JwtBuilder builder= Jwts.builder().setId("111")
.setSubject("coderyang")
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256,"jwttest");
System.out.println( builder.compact() );
}
解释:通过Jwts工具类可以设置 token 相关信息:
1.setId() 可以用登录用户的 userId 入参(不一定是userId)
2.setSubject(),可以用登录用户的用户名入参(不一定是用户名)
3.setIssuedAt() 是 token 签发时间,一般取当前时间
4.signWith() 入参两个参数,前一个是设置加密方式后一个是设置加密私钥
- (3)测试运行,输出如下:
二、token的解析:
上面已经创建了 token ,在 web 应用中这个操作是由服务端进行然后发给客户端,客户端在下次向服务端发送请求时需要携带这个 token(这就好像是拿着一张门票一样),那服务端接到这个 token 应该解析出其中的信息(例如用户id,用户名等),根据这些信息查询数据库返回相应的结果。
- 创建测试方法 parseJwtTest,用于解析 token
@Test
public void parseJwtTest(){
String token="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMTEiLCJzdWIiOiJjb2RlcnlhbmciLCJpYXQiOjE1ODIyNTEzODZ9.fQr0pPDq9OiBLKbHQMd_67eUNHwdrcerQMdeXtcQzi4";
Claims claims =
Jwts.parser().setSigningKey("jwttest").parseClaimsJws(token).getBody();
System.out.println("id:"+claims.getId());
System.out.println("subject:"+claims.getSubject());
System.out.println("IssuedAt:"+claims.getIssuedAt());
}
解释:还是通过 Jwts 工具类去解析 token
1.setSigningKey() 方法是设置我们之前在创建 token 的时候设置的私钥,需要和之前的保持一致,不然解析会出错。
2.parseClaimsJws() 方法是入参需要解析的 token,这里我们取上一步生成的
3.getBody() 方法返回 Claims 类型的对象,里面包含了我们设置的所有信息
4.然后调用相应的get方法就可以获取到 token 里携带的信息。
- (3)测试运行,输出如下:
三、自定义claims
我们刚才的例子只是存储了 id 和 subject 两个信息,如果你想存储更多的信息(例如角色)可以自定义 claims
- (1)创建测试方法 createJwtTest2,用于生成 token
@Test
public void createJwtTest2(){
//为了方便测试,我们将过期时间设置为1分钟
long now = System.currentTimeMillis();//当前时间
long exp = now + 1000*60;//过期时间为1分钟
JwtBuilder builder= Jwts.builder().setId("111")
.setSubject("coderyang")
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256,"jwttest")
.setExpiration(new Date(exp))
.claim("roles","admin"); //自定义claims存储数据
System.out.println( builder.compact() );
}
解释:相比之前的方法,这里添加了 token 过期时间和一个自定义的数据roles,其值为admin
- (2)测试运行,输出如下:
- (3)创建测试方法 parseJwtTest2,用于解析 token
@Test
public void parseJwtTest2() {
String token =
"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMTEiLCJzdWIiOiJjb2RlcnlhbmciLCJpYXQiOjE1ODIyNTM3MDYsImV4cCI6MTU4MjI1Mzc2Niwicm9sZXMiOiJhZG1pbiJ9.81FnRhl5OG0Lug3gdb_4PsdCgZnhwiUXSpoBng2B44o";
Claims claims = Jwts.parser().setSigningKey("jwttest").parseClaimsJws(token).getBody();
System.out.println("id:" + claims.getId());
System.out.println("subject:" + claims.getSubject());
System.out.println("IssuedAt:" + claims.getIssuedAt());
System.out.println("expiration" + claims.getExpiration());
System.out.println("roles:" + claims.get("roles"));
}
- (4)测试运行,输出如下: