首页 > 编程语言 > 详细

JAVA结合 JSON Web Token(JWT) 工具类

时间:2020-05-25 09:04:31      阅读:50      评论:0      收藏:0      [点我收藏+]

 

JWTUtils.java
package com.fh.util;


import io.jsonwebtoken.*;
import org.codehaus.jackson.map.ObjectMapper;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.UUID;

public class JWTUtils {

    //服务器的kye.用户做加解密的key数据。
    private static final String JWT_SECERT="jwt_secert";

    private static final ObjectMapper MAPPER=new ObjectMapper();

    public static SecretKey generalKey(){
        try {
            byte[] encodedKey=JWT_SECERT.getBytes("UTF-8");
            SecretKey key=new SecretKeySpec(encodedKey,0,encodedKey.length,"AES");
            return key;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }


    /**
     * 签发JWT,创建token的方法
     * @param id  jwt的唯一标识,主要用来做一次性token。
     * @param iss  jwt签发者
     * @param subject  jwt所面向的用户。一般使用用户的登录名
     * @param ttlMillis  有效期,单位毫秒
     * @return  token 是为一个用户的有效登录周期准备的一个tkoen 。用户推出或超时,token失效
     */
    public static String createJWT(String id,String iss,String subject,long ttlMillis){
       try {
           SignatureAlgorithm signatureAlgorithm= SignatureAlgorithm.HS256;
           long nowMilllis =System.currentTimeMillis();
           Date now=new Date(nowMilllis);
           SecretKey secretKey=generalKey();
           JwtBuilder builder= Jwts.builder()
                   .setId(id)
                   .setIssuer(iss)
                   .setSubject(subject)
                   .setIssuedAt(now)   //token生成时间
                   .signWith(signatureAlgorithm,secretKey);//设置密匙和算法
           if (ttlMillis>0){
               long expMillis=nowMilllis+ttlMillis;
               Date expDate=new Date(expMillis);
               builder.setExpiration(expDate);
           }
           return builder.compact();
       }catch (Exception e){
           e.printStackTrace();
       }
       return null;
    }


    /**
     * 解析JWT字符串
     * @param jwt  就是生成的toekn
     * @return
     */
    public static Claims parseJWT(String jwt){
        SecretKey secretKey=generalKey();
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(jwt)
                .getBody();
    }

    /**
     * 验证jwt
     * @param jwtStr
     * @return
     */
    public static String validateJWT(String jwtStr){
        Claims claims=null;
        try{
            claims=parseJWT(jwtStr);
            //成功
        }catch (ExpiredJwtException e){
            //token过期
            e.printStackTrace();
        }catch (SignatureException e){
            //签名错误
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    public static String generalSubject(Object subject){
        try {
            return MAPPER.writeValueAsString(subject);
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 使用 ——— 生成token
     */
    public void login(){
        //生成
        String jwtToken=JWTUtils.createJWT(UUID.randomUUID().toString(),"test-jwt",JWTUtils.generalSubject(user.getUsername),1*60*1000);
    }


    /**
     * 获取接口放在header中的token
     * @param request
     */
    public void  test(HttpServletRequest request){
        String token=request.getHeader("Authorization");//生成的token
        String result=JWTUtils.validateJWT(token);//验证
    }



}

 

JAVA结合 JSON Web Token(JWT) 工具类

原文:https://www.cnblogs.com/pxblog/p/12954756.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!