JJWT 0.11.2使用,工具类

方案一

导入JJWT依赖

<!--jjwt的相关依赖-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.11.2</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.11.2</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.11.2</version>
            <scope>runtime</scope>
        </dependency>
        
     <!---如果使用的是 JDK 10 或更早版本,并且还想使用
     RSASSA-PSS(PS256、PS384、PS512)算法需要导入以下依赖   
         <dependency>
	   		<groupId>org.bouncycastle</groupId>
	   		<artifactId>bcprov-jdk15on</artifactId>
	       	<version>1.60</version>
	   		<scope>runtime</scope>
		</dependency>
		-->

工具类

工具类可以自行改造使用构建器方式创建
package com.woniu.utils;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

//@Component
public class JwtUtils {
//    @Value("{jwt.skin.key}")
    //key的大小必须大于或等于256bit,需要32位英文字符,一个英文字符为:8bit,一个中文字符为12bit
    private String key="ssssssssssdfdsafasfdssdfsfsfssfs";
    //设置加密算法
    private SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256;
    /**
     * 获取转换后的私钥对象
     * @return
     */
    public SecretKey getSecretKey(){
        return Keys.hmacShaKeyFor(key.getBytes());
    }
    /**
     * 生成JWT
     * @param exp 指定过期时间,不能小于当前时间
     * @param payLoad 携带的数据
     * @return
     */
    public String createJwt(Date exp , Map<String,Object> payLoad){
       return Jwts.builder()
                .setClaims(payLoad)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(exp)
                .signWith(getSecretKey(),signatureAlgorithm)
                .compact();
    }

    /**
     * 解析JWS,返回一个布尔结果
     * @param jwsString
     * @return
     */
    public Boolean parseJwt(String jwsString){
        boolean result= false;
        try {
            Jwts.parserBuilder()
                    .setSigningKey(getSecretKey())
                    .build()
                    .parseClaimsJws(jwsString);
            result=true;
        }catch (JwtException e){
           result=false;
        }finally {
            return result;
        }
    }

    /**
     * 解析Jws,返回一个Jws对象
     * @param jwsString
     * @return
     */
    public Jws parseJwtResultJws(String jwsString){
        Jws<Claims> claims=null;
        try {
            claims = Jwts.parserBuilder()
                    .setSigningKey(getSecretKey())
                    .build()
                    .parseClaimsJws(jwsString);
        }catch (JwtException e){
            e.printStackTrace();
        }
        return claims;
    }
    /**
     * 获取header中的数据
     * @param jwsString
     * @return
     */
    public Map<String,Object> getHeader(String jwsString){
        return parseJwtResultJws(jwsString).getHeader();
    }

    /**
     * 获取PayLoad中携带的数据
     * @param jwsString
     * @return
     */
    public Map<String,Object> getPayLoad(String jwsString){
        return ((Map<String, Object>) (parseJwtResultJws(jwsString)).getBody());
    }

    /**
     * 获取除去exp和iat的数据,exp:过期时间,iat:JWT生成的时间
     * @param jwsString
     * @return
     */
    public Map<String,Object> getPayLoadALSOExcludeExpAndIat(String jwsString){
        Map<String, Object> map = getPayLoad(jwsString);
        map.remove("exp");
        map.remove("iat");
        return map;
    }

    public static void main(String[] args) {
        JwtUtils jwtUtils = new JwtUtils();
        Date exp = new Date(System.currentTimeMillis()+60*60*24);
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("name","张三");
        String jwt = jwtUtils.createJwt(exp, hashMap);
        System.out.println(jwt);
        System.out.println(jwtUtils.getPayLoadALSOExcludeExpAndIat(jwt));
    }

}


测试结果

在这里插入图片描述

方案二

导入JJWT依赖

<!--阿里的fastjson-->
 		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
<!--jjwt的相关依赖-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.11.2</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.11.2</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.11.2</version>
            <scope>runtime</scope>
        </dependency>
        
     <!---如果使用的是 JDK 10 或更早版本,并且还想使用
     RSASSA-PSS(PS256、PS384、PS512)算法需要导入以下依赖   
         <dependency>
	   		<groupId>org.bouncycastle</groupId>
	   		<artifactId>bcprov-jdk15on</artifactId>
	       	<version>1.60</version>
	   		<scope>runtime</scope>
		</dependency>
		-->

工具类

package com.woniu.utils;
import com.alibaba.fastjson.JSON;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import org.springframework.util.Base64Utils;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

//@Component
public class JwtUtils {
    //@Value("{jwt.skin.key}")
    //key的大小必须大于或等于256bit,需要32位英文字符,一个英文字符为:8bit,一个中文字符为12bit
    private String key="ssssssssssdfdsafasfdssdfsfsfssfs";
    //设置加密算法
    private SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256;
    //获取header中的数据
    private final Integer GET_HEADER_DATA =0;
    //获取payload中的数据
    private final Integer GET_PAYLOAD_DATA =1;
    /**
     * 获取转换后的私钥对象
     * @return
     */
    public SecretKey getSecretKey(){
        return Keys.hmacShaKeyFor(key.getBytes());
    }

    /**
     * 生成JWT
     * @param exp 指定过期时间,不能小于当前时间
     * @param payLoad 携带的数据
     * @return
     */
    public String createJwt(Date exp , Map<String,Object> payLoad){
       return Jwts.builder()
                .setClaims(payLoad)//设置携带参数
                .setIssuedAt(new Date(System.currentTimeMillis()))//创建时间
                .setExpiration(exp)//过期时间
                .signWith(getSecretKey(),signatureAlgorithm)//设置加密算法和私钥
                .compact();
    }

    /**
     * 解析JWS,返回一个布尔结果
     * @param jwsString
     * @return
     */
    public Boolean parseJwt(String jwsString){
        boolean result= false;
        try {
            Jwts.parserBuilder()
                    .setSigningKey(getSecretKey())//设置私钥
                    .build()
                    .parseClaimsJws(jwsString);//要解析的jws
            result=true;
        }catch (JwtException e){
            e.getMessage();
        }
        return result;
    }


    public String getJson(String jwsString,Integer code){
        //判断解析结果如果失败返回空,如果有全局异常处理,此处可抛自定义异常进行处理
        if(!parseJwt(jwsString)) return null;
        //将jws中的数据编码串截取出来使用Base64解析成字节数组
        byte[] decodePayLoad = Base64Utils.decodeFromString(jwsString.split("\\.")[code]);
        return new String(decodePayLoad);
    }

    public Map<String,Object> getData(String jwsString,Integer code){
        //此处使用的阿里的fastJson,可使用其他的工具将字节json字节转map
        return JSON.parseObject(getJson(jwsString,code),Map.class);
    }

    /**
     * 获取header中的数据
     * @param jwsString
     * @return
     */
    public Map<String,Object> getHeader(String jwsString){
        return getData(jwsString,GET_HEADER_DATA);
    }

    /**
     * 获取PayLoad中携带的数据
     * @param jwsString
     * @return
     */
    public Map<String,Object> getPayLoad(String jwsString){
        return getData(jwsString,GET_PAYLOAD_DATA);
    }

    /**
     * 获取除去exp和iat的数据,exp:过期时间,iat:JWT生成的时间
     * @param jwsString
     * @return
     */
    public Map<String,Object> getPayLoadALSOExcludeExpAndIat(String jwsString){
        Map<String, Object> map = getData(jwsString, GET_PAYLOAD_DATA);
        map.remove("exp");
        map.remove("iat");
        return map;
    }


    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) {
        //创建一个过期时间
        Date date = new Date(System.currentTimeMillis()+60*60*24);
        //设置要携带的数据
        Map<String,Object> map = new HashMap<>();
        map.put("name","张三");
        //创建工具类对象
        JwtUtils jwtUtils = new JwtUtils();
        String jwt = jwtUtils.createJwt(date, map);
        System.out.println(jwt);
        jwtUtils.parseJwt(jwt);
        System.out.println(jwtUtils.getPayLoad(jwt));
    }
}

测试结果

在这里插入图片描述

jwt官网

jwt官网:https://jwt.io
源码:https://github.com/jwtk/jjwt#install-jdk

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Spring Boot集成JJWT使用示例: 1. 首先,确保在pom.xml文件中添加所需的依赖项: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.2</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency> ``` 2. 创建一个JWT工具类,用于生成和解析JWT令牌: ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class JwtUtils { private static final String SECRET_KEY = "your-secret-key"; private static final long EXPIRATION_TIME = 86400000; // 24小时 public static String generateToken(String username) { Date now = new Date(); Date expiration = new Date(now.getTime() + EXPIRATION_TIME); return Jwts.builder() .setSubject(username) .setIssuedAt(now) .setExpiration(expiration) .signWith(SignatureAlgorithm.HS256, SECRET_KEY) .compact(); } public static String getUsernameFromToken(String token) { Claims claims = Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody(); return claims.getSubject(); } public static boolean validateToken(String token) { try { Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token); return true; } catch (Exception e) { return false; } } } ``` 3. 在需要进行身份验证的地方,使用JWT工具类生成和验证令牌: ```java @RestController public class UserController { @PostMapping("/login") public String login(@RequestBody UserCredentials credentials) { // 验证用户名和密码 if (authenticate(credentials.getUsername(), credentials.getPassword())) { // 生成JWT令牌 String token = JwtUtils.generateToken(credentials.getUsername()); return token; } else { return "Authentication failed"; } } @GetMapping("/user") public String getUser(@RequestHeader("Authorization") String token) { // 验证令牌 if (JwtUtils.validateToken(token)) { String username = JwtUtils.getUsernameFromToken(token); return "Hello, " + username; } else { return "Invalid token"; } } private boolean authenticate(String username, String password) { // 进行身份验证逻辑 // 返回true表示验证通过,返回false表示验证失败 } } ``` 请注意,上述示例中的`your-secret-key`应替换为您自己的密钥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值