java jjwt-api使用,java jwt使用,java jwt 工具類

1、引入jjwt-api依賴java

<properties>
    <!-- 構建時編碼 -->    
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 輸出時編碼 -->
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <!-- JDK版本 -->
    <java.version>1.8</java.version>
    <jjwt.version>0.11.2</jjwt.version>
</properties>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-api</artifactId>
    <version>${jjwt.version}</version>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>${jjwt.version}</version>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-jackson</artifactId>
    <version>${jjwt.version}</version>
    <scope>runtime</scope>
</dependency>

2、 jjwt-api實現工具類mysql

import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.lqy.study.exception.RunException;
import com.lqy.study.utils.DateUtils;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.MissingClaimException;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.io.Decoders;

@Component
public class JwtUtils {

    private static Logger log = Logger.getLogger(JwtUtils.class);

    private static String secretKey;

    private static String aa;//測試靜態變量注入

    /**
     * 靜態變量注入
     * 從配置文件讀取jjwt.key屬性
     * 注入key,set方法不能是static
     * @param secretKey
     */
    @Value("${jjwt.key}")
    public void setSecretKey(String secretKey) {
        JwtUtils.secretKey = secretKey;
    }./*歡迎加入java交流Q君樣:909038429一塊兒吹水聊天

    /**
     * 靜態實體變量注入
     * jjwtProperties須要配置:@ConfigurationProperties(prefix = "jjwt", ignoreUnknownFields = true)
     * @param jjwtProperties
     */
    @Autowired
    public void setSecretKey(JjwtProperties jjwtProperties) {
        JwtUtils.aa = jjwtProperties.getKey();
    }

    private static String KEY_CLAIMS = "key_claims";
    private static String SUBJECT = "key_subject";

    private JwtUtils(){

    }

    /**
     * 生成token
     * @return
     * @throws ParseException
     */
    public static String getToken() throws ParseException {
        //Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

        log.info("aa===" + aa);

        Date now = new Date();
        Date expirationDate = DateUtils.addMinute(null, 2);//增長2分鐘的過時時間,用於測試

        log.info("now===" + DateUtils.formatDateTime(now));
        log.info("expirationDate===" + DateUtils.formatDateTime(expirationDate));

        Map<String, Object> claims = new HashMap<String, Object>();
        User user = new User();
        user.setId(1000L);
        user.setName("張三");
        claims.put(KEY_CLAIMS, user);

        String token = Jwts.builder()
                        .setClaims(claims)//必須放最前面,否則後面設置的東西都會沒有:如setExpiration會沒有時間
                        .setId(UUID.randomUUID().toString())
                        .setSubject(SUBJECT)
                        .setIssuedAt(now)
                        .setExpiration(expirationDate)//過時時間
                        .signWith(SignatureAlgorithm.HS256, getSecretKey())
                        .compact();

        log.info("token===" + token);

        return token;
    }

    /**
     * 解析token,並返回User對象
     * @param token
     * @return
     * @throws ParseException
     */
    public static User parseToken(String token) throws ParseException {

        String msg = null;
        try {
            Jws<Claims> jws = Jwts.parser()
                    .setSigningKey(getSecretKey())
                    .requireSubject(SUBJECT)//校驗必須有這個屬性,能夠省略這步
                    .parseClaimsJws(token);

            Claims claims = jws.getBody();//Claims是一個Map

            log.info("claims===" + JSONUtil.toJsonStr(claims));
            log.info("claims.getIssuedAt()===" + claims.getIssuedAt());
            log.info("claims.getExpiration()===" + claims.getExpiration());

            //map轉實體
            User user = BeanUtil.toBean(claims.get(KEY_CLAIMS), User.class);
            log.info("user===" + JSONUtil.toJsonStr(user));

            return user;

        }catch (SignatureException se) {
            msg = "密鑰錯誤";
            log.error(msg, se);
            throw new RunException(msg);

        }catch (MalformedJwtException me) {
            msg = "密鑰算法或者密鑰轉換錯誤";
            log.error(msg, me);
            throw new RunException(msg);

        }catch (MissingClaimException mce) {
            msg = "密鑰缺乏校驗數據";
            log.error(msg, mce);
            throw new RunException(msg);

        }catch (ExpiredJwtException mce) {
            msg = "密鑰已過時";
            log.error(msg, mce);
            throw new RunException(msg);

        }catch (JwtException jwte) {
            msg = "密鑰解析錯誤";
            log.error(msg, jwte);
            throw new RunException(msg);
        }

    }

    /**
     * 獲取自定義密鑰
     * @return
     */
    private static byte[] getSecretKey() {
        //log.info("secretKey = " + secretKey);
        if(StringUtils.isBlank(secretKey)) {
            throw new RunException("jjwt配置的密鑰不能爲空");
        }
        return Decoders.BASE64.decode(secretKey);
    }

    public static void main(String[] args) throws Exception {
        getToken();
    }

}

User類:web

public class User {

    private Long id;
    private String name;

    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + "]";
    }
}./*歡迎加入java交流Q君樣:909038429一塊兒吹水聊天

3、科普springboot靜態變量注入的方式面試

一、靜態變量secretKey經過配置文件application.properties的屬性注入,並使用base64編碼,取出來的時候,須要解碼(配置文件的屬性也能夠不編碼,直接取出來)算法

jjwt.key=aXNsZWVfaGFoYQ==

注入方式:方法加註解@Value("${jjwt.key}"),變量做爲參數spring

/**
 * 靜態變量注入
 * 從配置文件讀取jjwt.key屬性
 * 注入key,set方法不能是static
 * @param secretKey
 */
@Value("${jjwt.key}")
public void setSecretKey(String secretKey) {
    JwtUtils.secretKey = secretKey;
}

二、靜態實體變量 jjwtProperties 注入,一樣經過經過配置文件application.properties的屬性注入,但能夠直接配置多個屬性(僅用於學習,可忽略):sql

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "jjwt", ignoreUnknownFields = true)
public class JjwtProperties {

    private String key;

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }
}

注入的方式:方法加上@Autowired註解,實體做爲參數apache

/**
 * 靜態實體變量注入
 * jjwtProperties須要配置:@ConfigurationProperties(prefix = "jjwt", ignoreUnknownFields = true)
 * @param jjwtProperties
 */
@Autowired
public void setSecretKey(JjwtProperties jjwtProperties) {
    JwtUtils.aa = jjwtProperties.getKey();
}

image
最新2020整理收集的一些高頻面試題(都整理成文檔),有不少乾貨,包含mysql,netty,spring,線程,spring cloud、jvm、源碼、算法等詳細講解,也有詳細的學習規劃圖,面試題整理等,須要獲取這些內容的朋友請加Q君樣:909038429
/./*歡迎加入java交流Q君樣:909038429一塊兒吹水聊天json

相關文章
相關標籤/搜索