好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java使用JWT的方法

一、简介

JWT是token的一种,一个JWT字符串包含三个部分

1.Header

头部信息,一般不需要声明,默认为 HS256 签名算法和 JWT 令牌类型

?

1

2

3

4

{

   "alg" : "HS256" ,    // 指定签名算法

   "typ" : "JWT"        // 指定token令牌类型

}

2.Payload

包含一些默认字段,还可以自定义一些私有字段,但是不要放敏感信息

iss: 发行人
exp: 到期时间
sub: 主题
aud: 用户
nbf: 在此之前不可用
iat: 发布时间
jti: JWT ID用于标识该JWT

3.Signature

数据签名,对上面两部分进行数据签名,Header部分和Payload部分先进行base64Url编码,然后用英文句号拼接并加上一个自定义的secret字符串盐值进行HS256对称加密【也可以用其它算法或非对称加密】

?

1

2

3

4

5

6

7

iss: 发行人

exp: 到期时间

sub: 主题

aud: 用户

nbf: 在此之前不可用

iat: 发布时间

jti: JWT ID用于标识该JWT

4.组合

最后将 Header、Payload、Signature三部分用英文句号拼接就生成了完整的JWT

?

1

Header.Payload.Signature

二、封装类

1.引入依赖

?

1

2

3

4

5

6

<!-- jwt -->

<dependency>

     <groupId>com.auth0</groupId>

     <artifactId>java-jwt</artifactId>

     <version>3.10.3</version>

</dependency>

2.封装方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

package com.cxstar.utils;

import com.auth0.jwt.JWT;

import com.auth0.jwt.JWTCreator;

import com.auth0.jwt.algorithms.Algorithm;

import com.auth0.jwt.interfaces.DecodedJWT;

import com.auth0.jwt.interfaces.JWTVerifier;

import java.util.Calendar;

import java.util.Map;

public class JwtUtil {

     // 签名密钥

     private static final String SECRET = "hello JWT *%$#$&" ;

     /**

      * 生成token

      * @param payload token携带的信息

      * @return token字符串

      */

     public static String generateToken(Map<String,String> payload){

         // 指定token过期时间

         Calendar calendar = Calendar.getInstance();

         calendar.add(Calendar.HOUR, 24 );  // 24小时

         JWTCreator.Builder builder = JWT.create();

         // 构建payload

         payload.forEach(builder::withClaim);

         // 指定过期时间和签名算法,并返回token

         String token = builder.withExpiresAt(calendar.getTime()).sign(Algorithm.HMAC256(SECRET));

         return token;

     }

 

     /**

      * 解析token

      * @param token token字符串

      * @return 解析后的token类

      */

     public static DecodedJWT decodeToken(String token){

         JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(SECRET)).build();

         DecodedJWT decodedJWT = jwtVerifier.verify(token);

         return decodedJWT;

     }

}

三、使用方法

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

package com.cxstar;

import com.auth0.jwt.exceptions.JWTDecodeException;

import com.auth0.jwt.exceptions.TokenExpiredException;

import com.auth0.jwt.interfaces.DecodedJWT;

import com.cxstar.utils.JwtUtil;

import org.junit.jupiter.api.Test;

import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;

import java.util.Map;

@SpringBootTest

class JwtLoginApplicationTests {

     @Test

     void tokenTest() {

         // 根据用户信息生成令牌 --------------------------

         Map<String, String> payload = new HashMap<>();

         payload.put( "userId" , "233" );

         payload.put( "userName" , "ps" );

         String token = JwtUtil.generateToken(payload);

         System.out.println( "token: " + token);

         // --------------------------------------------

         // 解析令牌并获取用户信息 ------------------------------------------------

         try {

             DecodedJWT decodedJWT = JwtUtil.decodeToken(token);

             String userId = decodedJWT.getClaim( "userId" ).asString();

             String userName = decodedJWT.getClaim( "userName" ).asString();

             String exp = decodedJWT.getExpiresAt().toString();

             System.out.println( "userId: " + userId);      // 取出自定义属性【用户id】

             System.out.println( "userName: " + userName);  // 取出自定义属性【用户名】

             System.out.println( "exp: " + exp);            // 取出默认属性【过期时间】

         } catch (JWTDecodeException e) {

             System.out.println( "令牌错误" );

         } catch (TokenExpiredException e) {

             System.out.println( "令牌过期" );

         }

         // -------------------------------------------------------------------

     }

 

}

到此这篇关于java使用JWT的文章就介绍到这了,更多相关java使用JWT内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

原文链接:https://blog.csdn.net/weixin_43721000/article/details/125142277

查看更多关于java使用JWT的方法的详细内容...

  阅读:20次