TOKEN-生成及检验



 1.定义checkToken枚举


 

package com.jwt;

/**
 * 枚举,定义token的三种状态
 * @author DrangoneYu@163.com
 *
 */
 public enum TokenState {  
     /**
      * 过期
      */
    EXPIRED("EXPIRED"),
    /**
     * 无效(token不合法)
     */
    INVALID("INVALID"), 
    /**
     * 有效的
     */
    VALID("VALID");  
    
    private String  state;  
      
    private TokenState(String state) {  
        this.state = state;  
    }
    
    /**
     * 根据状态字符串获取token状态枚举对象
     * @param tokenState
     * @return
     */
    public static TokenState getTokenState(String tokenState){
        TokenState[] states=TokenState.values();
        TokenState ts=null;
        for (TokenState state : states) {
            if(state.toString().equals(tokenState)){
                ts=state;
                break;
            }
        }
        return ts;
    }
    public String toString() {
        return this.state;
    }
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
    }
    
}  

 

 


 2.生成TOKEN及检验TOKEN工具类


   1 package com.jwt;  2 import java.util.Date;

 3 import java.util.HashMap;  4 import java.util.Map;  5  6 import com.nimbusds.jose.JOSEException;  7 import com.nimbusds.jose.JOSEObjectType;  8 import com.nimbusds.jose.JWSAlgorithm;  9 import com.nimbusds.jose.JWSHeader;  10 import com.nimbusds.jose.JWSObject;  11 import com.nimbusds.jose.JWSVerifier;  12 import com.nimbusds.jose.Payload;  13 import com.nimbusds.jose.crypto.MACSigner;  14 import com.nimbusds.jose.crypto.MACVerifier;  15  16 import net.minidev.json.JSONObject;  17 /**  18  *  19  * @author DrangoneYu@163.com  20  *  21 */  22 public class Jwt {  23  24  25 /**  26  * 秘钥  27 */  28 private static final byte[] SECRET="DrangoneYu@163fac04467df11fff26d".getBytes();  29  30 /**  31  * 初始化head部分的数据为  32  * {  33  * "alg":"HS256",  34  * "type":"JWT"  35  * }  36 */  37 private static final JWSHeader header=new JWSHeader(JWSAlgorithm.HS256, JOSEObjectType.JWT, null, null, null, null, null, null, null, null, null, null, null);  38  39 /**  40  * 生成token,该方法只在用户登录成功后调用  41  *  42  * @param Map集合,可以存储用户id,token生成时间,token过期时间等自定义字段  43  * @return token字符串,若失败则返回null  44 */  45 public static String createToken(Map<String, Object> payload) {  46 String tokenString=null;  47 // 创建一个 JWS object  48 JWSObject jwsObject = new JWSObject(header, new Payload(new JSONObject(payload)));  49 try {  50 // 将jwsObject 进行HMAC签名  51 jwsObject.sign(new MACSigner(SECRET));  52 tokenString=jwsObject.serialize();  53 } catch (JOSEException e) {  54 System.err.println("签名失败:" + e.getMessage());  55  e.printStackTrace();  56  }  57 return tokenString;  58  }  59  60  61  62 /**  63  * 校验token是否合法,返回Map集合,集合中主要包含 state状态码 data鉴权成功后从token中提取的数据  64  * 该方法在过滤器中调用,每次请求API时都校验  65  * @param token  66  * @return Map<String, Object>  67 */  68 public static Map<String, Object> validToken(String token) {  69 Map<String, Object> resultMap = new HashMap<String, Object>();  70 try {  71 JWSObject jwsObject = JWSObject.parse(token);  72 Payload payload = jwsObject.getPayload();  73 JWSVerifier verifier = new MACVerifier(SECRET);  74  75 if (jwsObject.verify(verifier)) {  76 JSONObject jsonOBj = payload.toJSONObject();  77 // token校验成功(此时没有校验是否过期)  78 resultMap.put("state", TokenState.VALID.toString());  79 // 若payload包含ext字段,则校验是否过期  80 if (jsonOBj.containsKey("ext")) {  81 long extTime = Long.valueOf(jsonOBj.get("ext").toString());  82 long curTime = new Date().getTime();  83 // 过期了  84 if (curTime > extTime) {  85  resultMap.clear();  86 resultMap.put("state", TokenState.EXPIRED.toString());  87  }  88  }  89 resultMap.put("data", jsonOBj);  90  91 } else {  92 // 校验失败  93 resultMap.put("state", TokenState.INVALID.toString());  94  }  95  96 } catch (Exception e) {  97 //e.printStackTrace();  98 // token格式不合法导致的异常  99  resultMap.clear(); 100 resultMap.put("state", TokenState.INVALID.toString()); 101  } 102 return resultMap; 103  } 104

105 }

 

public static void main(String[] args) {
  Map<String , Object> payload=new HashMap<String, Object>();
  Date date=new Date();
  payload.put("uid", "291969452");//用户id
  payload.put("iat", date.getTime());//生成时间
  payload.put("ext",date.getTime()+1000*60*60);//过期时间1小时
  String token=null;
  token=Jwt.createToken(payload);
}

 


 

 3.依赖jar

      asm-1.0-RC1.jar

    java-property-utils-1.9.1.jar

    json-smart-2.0-RC2.jar

      nimbus-jose-jwt-4.1.3.1.jar


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM