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

    }
}

猜你喜欢

转载自blog.csdn.net/u013089490/article/details/84853600
今日推荐