Java版Jwt工具类

JWT实现跨域用户登录,java实例,验证token

package com.mime;

import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Collection;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.codec.binary.Base64;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class JwtUtil {

    private static String audience = "www.hengshashu.com";

    private static String header = "token";

    private static String issuer = "乙未豪客传奇";

    private static String privateKey = "ooo";

    private static String publicKey = "xxx";

    private static String secret = "b8d3959b64c74bf6bb15c51112270f69";

    private int expire = 86400;

    /**
     * 解析jwt
     */
    public Claims parseJWT(String token) {
        return Jwts.parser().setSigningKey(generatePublicKey(this.publicKey)).parseClaimsJws(token).getBody();
    }

    /**
     * 获取认证参数信息
     *
     * @param claims
     * @return
     */
    public PayLoad parseToken(Claims claims) {
        PayLoad payLoad = new PayLoad();
        payLoad.setOrgId(Long.valueOf(claims.get("orgId").toString()));
        payLoad.setActivityId(Long.valueOf(claims.get("activityId").toString()));
        return payLoad;
    }

    /**
     * 构建jwt
     */
    public String createJWT(Long orgId, Long activityId, long expirationTime) {
        //添加构成JWT的参数
        JwtBuilder builder = Jwts.builder().setHeaderParam("typ", "JWT")
                .claim("orgId", orgId)
                .claim("activityId", activityId)
                .setIssuer(this.issuer)
                .setAudience(this.audience)
                .signWith(SignatureAlgorithm.RS256, generatePrivateKey(this.privateKey));
        //添加Token过期时间
        if (expirationTime >= 0) {
            Date nowDate = new Date();
            //过期时间
            Date expireDate = new Date(nowDate.getTime() + this.expire * 1000);
            builder.setExpiration(expireDate);
        }
        //生成JWT
        return builder.compact();
    }

    /**
     * 获取登录信息
     *
     * @param request
     * @return
     */
    public PayLoad getAuth(HttpServletRequest request) {
        //从请求头获取信息
        String token = request.getHeader(this.header);
        //请求中获取信息
        if (!isEmpty(token)) {
            Claims jwt = parseJWT(token);
            PayLoad payLoad = parseToken(jwt);
            return payLoad;
        }
        return null;
    }

    /**
     * 验证token
     *
     * @param request
     * @return
     */
    public PayLoad validateToken(HttpServletRequest request) {
        return getAuth(request);
    }


    public  PublicKey generatePublicKey(String publicKeyBase64) {
        String pem = publicKeyBase64.replaceAll("\\-*BEGIN PUBLIC KEY\\-*", "").replaceAll("\\-*END PUBLIC KEY\\-*", "")
                .trim();
        java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(pem));
        KeyFactory keyFactory = null;
        PublicKey publicKey = null;
        try {
            keyFactory = KeyFactory.getInstance("RSA");
            publicKey = keyFactory.generatePublic(pubKeySpec);

        } catch (Exception e) {
            System.out.println("生成公钥异常:{}"+e.getMessage());
        }
        return publicKey;
    }


    public  PrivateKey generatePrivateKey(String publicKeyBase64) {
        String pem = publicKeyBase64.replaceAll("\\-*BEGIN PRIVATE KEY\\-*", "").replaceAll("\\-*END PRIVATE KEY\\-*", "")
                .trim();
        java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(pem));
        KeyFactory keyFactory = null;
        PrivateKey privateKey = null;
        try {
            keyFactory = KeyFactory.getInstance("RSA");
            privateKey = keyFactory.generatePrivate(priKeySpec);

        } catch (Exception e) {
           System.out.println("生成私钥异常:{}"+e.getMessage());
        }
        return privateKey;
    }
    
    /**
     * 判断对象是否Empty(null或元素为0)
     * 实用于对如下对象做判断:String Collection及其子类 Map及其子类
     *
     * @param pObj 待检查对象
     * @return boolean 返回的布尔值
     */
    public static boolean isEmpty(Object pObj) {
        if (pObj == null) {
            return true;
        }
        if ("" == pObj) {
            return true;
        }
        if (pObj instanceof String) {
            return ((String) pObj).length() == 0;
        } else if (pObj instanceof Collection) {
            return ((Collection) pObj).isEmpty();
        } else if (pObj instanceof Collection) {
            return ((Collection) pObj).size() == 0;
        } else if (pObj instanceof Map) {
            return ((Map) pObj).size() == 0;
        }
        return false;
    }
    
    public class PayLoad {

        private Long orgId;

        private Long activityId;

        public Long getOrgId() {
            return orgId;
        }

        public void setOrgId(Long orgId) {
            this.orgId = orgId;
        }

        public Long getActivityId() {
            return activityId;
        }

        public void setActivityId(Long activityId) {
            this.activityId = activityId;
        }
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值