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;
}
}
}