1. 程式人生 > >JWT篇2:java中的JJWT

JWT篇2:java中的JJWT

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()));

    }
}