JWT篇2:java中的JJWT
阿新 • • 發佈:2018-12-21
JJWT全稱就是java Json web token。JJWT是一個提供端到端的JWT建立和驗證的java庫。
【pom檔案依賴】
<!--引入jjwt生成token--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.6.0</version> </dependency>
1、生成token
程式碼如下
import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; /** * JJWT生成token **/ public class CreateToken { public static void main(String[] args) { //Jwts.builder()表示建立 JwtBuilder builder= Jwts.builder().setId("16") //setId一般是使用者id .setSubject("可非") // .setIssuedAt(new Date()) //setIssuedAt用於設定簽發時間 .signWith(SignatureAlgorithm.HS256,"kefei"); //signWith設定簽名的祕鑰 System.out.println(builder.compact()); } }
以上程式碼生成的token:eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxNiIsInN1YiI6IuWPr-mdniIsImlhdCI6MTU0NDA3OTM3OH0.eeNG-3sC4Qe-LDFaTIxdDbZ6VIg-8rXAYOPPx1ZZ1Dg
【注意】我們發現每次執行就會生成的token值都不一樣
2、解析token
在上一節中生成了token,在web應用中這個操作時由伺服器端進行然後傳送給客戶端,客戶端在下次向服務端傳送請求時需要攜帶這個token進行驗證,那服務端接收到這個token之後應該是解析出token中的資訊,如使用者id,使用者名稱稱,使用者角色等資訊。
/**
* 解析token
**/
public class ParseToken {
public static void main(String[] args) {
String token="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxNiIsInN1YiI6IuWPr-mdniIsImlhdCI6MTU0NDA3OTM3OH0.eeNG-3sC4Qe-LDFaTIxdDbZ6VIg-8rXAYOPPx1ZZ1Dg";
Claims claims =
Jwts.parser().setSigningKey("kefei").parseClaimsJws(token).getBody();
System.out.println("使用者id:"+claims.getId());
System.out.println("Subject使用者名稱:"+claims.getSubject());
System.out.println("IssuedAt簽發時間:"+claims.getIssuedAt());
}
}
【解析的結果】
3、token的過期校驗
/**
* JJWT生成token,含過期時間
**/
public class CreateTokenExp {
public static void main(String[] args) {
//得到當前時間,打我是毫秒
long now = System.currentTimeMillis();
long exp = now+1000*60;//設定過期時間為1分鐘
//Jwts.builder()表示建立
JwtBuilder builder= Jwts.builder().setId("16") //setId一般是使用者id
.setSubject("可非") //
.setIssuedAt(new Date()) //setIssuedAt用於設定簽發時間
.signWith(SignatureAlgorithm.HS256,"kefei")
.setExpiration(new Date(exp)) //設定token的過期時間
; //signWith設定簽名的祕鑰
System.out.println(builder.compact());
}
}
【解析過期token的提示】
4、自定義claims
【自定義生成token】
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
/**
* 自定義token
**/
public class CustomToken {
public static void main(String[] args) {
//得到當前時間,打我是毫秒
long now = System.currentTimeMillis();
long exp = now+1000*60*60;//設定過期時間為1分鐘
JwtBuilder builder = Jwts.builder().setId("103")//使用者id
.setSubject("張三丰") //使用者名稱稱
.setIssuedAt(new Date())//token簽發時間
.signWith(SignatureAlgorithm.HS256, "kefei")
.setExpiration(new Date(exp))//token過期時間
.claim("roles", "admin")//使用者角色資訊
.claim("logo", "logo.png");//使用者影象
System.out.println("token:"+builder.compact());
}
}
【解析自定義token】
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 解析token
**/
public class ParseToken {
public static void main(String[] args) {
String token=
"eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxMDMiLCJzdWIiOiLlvKDkuInkuLAiLCJpYXQiOjE1NDQwODEzNjQsImV4cCI6MTU0NDA4NDk2Mywicm9sZXMiOiJhZG1pbiIsImxvZ28iOiJsb2dvLnBuZyJ9.llJe0YjkeVmUKjC4l_1kYAD33MqpHRvPZrQ2zRgj0zc";
Claims claims =
Jwts.parser().setSigningKey("kefei").parseClaimsJws(token).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()));
}
}