添加依賴pom.xml
<!-- JAVA代碼生成JWT--> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.37</version> </dependency> <!-- SONObject只是一種數據結構,可以理解為JSON格式的數據結構(key-value 結構),可以使用put方法給json對象添加元素。--> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20140107</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency>
jwtUtils.java
package com.ibaiqi.house.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.sun.org.apache.xml.internal.security.algorithms.implementations.SignatureDSA; import io.jsonwebtoken.Claims; import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import org.apache.shiro.codec.Base64; import io.jsonwebtoken.SignatureAlgorithm; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.util.Date; public class JwtUtils { //密碼 private static final String secret = "66diangezanbageixioapang12oc"; /** * (默認的超時時間)token存活時間,2小時 */ private static final long liveMills = 3600 * 2 * 1000; /** * 獲取secret */ public static SecretKey obtainKey() { //對key進行解碼 byte[] secretBytes = secret.getBytes(); return new SecretKeySpec(secretBytes, 0, secretBytes.length, "AES"); } /** * 獲取token,使用默認的超時時間,即2個小時。 * * @param sub 主題(需要加密的字符串) * @return token字符串 */ public static String createJWT(String sub) { return createJWT(sub, liveMills); } /** * 會自動對主題對象序列化(使用fastJson進行序列化)得到字符串 * * @param subObj 主題對象 * @return token字符串 */ public static <T> String createJWT(T subObj) { return createJWT(JSONObject.toJSONString(subObj), liveMills); } /** * 會自動對主題對象序列化(使用fastJson進行序列化)得到字符串 * * @param subObj 主題對象 * @param liveMills 失效時間,單位毫秒 * @return token字符串 */ public static <T> String createJWT(T subObj, Long liveMills) { return createJWT(JSONObject.toJSONString(subObj), liveMills); } /** * @param sub 需要加密的主題 * @param liveMills 失效時間,單位毫秒 * @return 經過jwt加密的token字符串,失效時間即當前時間+liveMills毫秒數 */ public static String createJWT(String sub, Long liveMills) { //加密模式 SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; long currentTimeMillis = System.currentTimeMillis(); Date now = new Date(currentTimeMillis); //iat token簽發時間 SecretKey secretKey = obtainKey(); //jti表示該token的唯一id,不推薦使用相同值|isa 下發時間 JwtBuilder jwtBuilder = Jwts.builder().setId("jti-xp"). setIssuedAt(now). //設置簽發時間 setSubject(sub). signWith(signatureAlgorithm, secretKey);////設置簽名秘鑰 if (liveMills > 0) { long expMills = currentTimeMillis + liveMills; Date expDate = new Date(expMills); //失效時間 jwtBuilder.setExpiration(expDate); } return jwtBuilder.compact(); } /** * 解密token,返回Claims對象 * <p> * 注,若token失效,會拋出{@link ExpiredJwtException}的異常 **/ public static Claims parseJWT(String token) { SecretKey key = obtainKey(); return Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody(); // Claims [kleɪmz] 聲明 } /** * 解析token獲取到sub(主題)。 * <p> * 注,若token失效,會拋出{@link ExpiredJwtException}的異常 */ public static String parseJWT2Sub(String token) { SecretKey key = obtainKey(); Claims body = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody(); return body.getSubject(); } /** * 解密token獲取sub,並反序列化為對象。 * * @param token 需要解密的token字符串 * @param clazz sub反序列化的對象類型 */ public static <T> T parseJWT2Sub(String token, Class<T> clazz) { SecretKey key = obtainKey(); Claims body = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody(); return JSON.parseObject(body.getSubject(), clazz); } public static void main(String[] args) { JSONObject jsonObject = new JSONObject(); jsonObject.put("username", "xiaopang"); jsonObject.put("host", "127.0.0.1"); System.out.println("jsonObject.toJSONString()的值:"+jsonObject.toJSONString()); String token = JwtUtils.createJWT(jsonObject.toJSONString()); System.out.println("生成的token:"+token); //解析token Claims claims = parseJWT(token); String subject = claims.getSubject(); System.out.println(subject); //base64 payload解析 String payload="eyJqdGkiOiJqdGkteHAiLCJpYXQiOjE1NjM5NDcxMTAsInN1YiI6IntcImhvc3RcIjpcIjEyNy4wLjAuMVwiLFwidXNlcm5hbWVcIjpcInhpYW9wYW5nXCJ9IiwiZXhwIjoxNTYzOTU0MzEwfQ"; //org.apache.shiro.codec.Base64 System.out.println("payload的base64解密:"+new String(Base64.decode(payload))); //base64 header解析 String header="eyJhbGciOiJIUzI1NiJ9"; System.out.println("header的base64解密:"+new String(Base64.decode(header))); } }