-
[郑州|结业弟子]JAVA-何爽0
1.首先你用的是jjwt并不是jwt。
2.jjwt的依赖包:
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.7.0</version>
</dependency>3.我的jwt工具类:
package com.task5.until;
import io.jsonwebtoken.*;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class JWT {
private String key;
@Autowired
private DES des;
public void setKey(String key) {
this.key = key;
}
//生成jwt
public String generateToken(String username, long expiry) {
io.jsonwebtoken.SignatureAlgorithm signatureAlgorithm = io.jsonwebtoken.SignatureAlgorithm.HS256; //指定签名的时候使用的签名算法,也就是header那部分,jjwt已经将这部分内容封装好了。
//生成jwt的时间
Long now = System.currentTimeMillis();
Date generateTime = new Date(now);
//创建payload的私有声明(根据特定的业务需要添加,如果要拿这个做验证,一般是需要和jwt的接收方提前沟通好验证方式的)
Map<String, Object> claims = new HashMap<>();
claims.put("username", des.encrypt(username));
claims.put("generateTime", des.encrypt(generateTime.toString()));
JwtBuilder jwtBuilder = Jwts.builder()//这里其实就是new一个JwtBuilder,设置jwt的body
.setClaims(claims)//如果有私有声明,一定要先设置这个自己创建的私有的声明,这个是给builder的claim赋值,一旦写在标准的声明赋值之后,就是覆盖了那些标准的声明的
.setIssuedAt(generateTime)//签发时间
.signWith(signatureAlgorithm, key);
if (expiry > 0) {
Date expiryTime = new Date(now + expiry);//过期时间
jwtBuilder.setExpiration(expiryTime);
}
return jwtBuilder.compact();
}
public Map<String, Object> parseToken(String token) {
Map<String, Object> result = new HashMap<>();
if (token != null) {
// 解析token
try {
Map<String, Object> body = Jwts.parser()
.setSigningKey(key)
.parseClaimsJws(token)
.getBody();
String username = (String) body.get("username");
String generateTime = (String) body.get("generateTime");
if (username == null || username.isEmpty()) {
result.put("ERR_MSG", "您还没有登录,请登录:");
return result;
}
result.put("username", des.decrypt(username));
result.put("generateTime", des.decrypt(generateTime));
return result;
} catch (SignatureException | MalformedJwtException e) {
// jwt 解析错误
result.put("ERR_MSG", "系统错误,请尝试重新登录:");
return result;
} catch (ExpiredJwtException e) {
// jwt 已经过期,在设置jwt的时候如果设置了过期时间,这里会自动判断jwt是否已经过期,如果过期则会抛出这个异常,我们可以抓住这个异常并作相关处理。
result.put("ERR_MSG", "登录信息已过期,请登录:");
return result;
}
} else {
result.put("ERR_MSG", "没有您的身份信息,请登录:");
return result;
}
}
}4.尝试下放进你的项目中,看下可以使用不,后续还有问题可以私聊我。
编辑于2018-09-28 -
[上海|荣耀师兄]JAVA-朱明星0
我用的是这一堆
<!--Jwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.5</version>
<scope>runtime</scope>
</dependency>
/**
* jwt协议的加密解密,组要设置加密算法,加密密钥,过期时间
* 加密时,将username加进去
* 解密时,需要进行过期校验、密钥校验
*/
//签名密钥(高度保密)
private static final String KEY = "HelloWorld!";
private static final int calendarField = Calendar.DATE;
private static final int calendarInterval = 10;
public static String createJWT(String username, long loginTime) throws UnsupportedEncodingException {
Map<String,Object> map = new HashMap<>();
map.put("alg","HS256");
map.put("typ","JWT");
Date time = new Date();
Calendar currentTime = Calendar.getInstance();
currentTime.add(calendarField, calendarInterval);
Date expires = currentTime.getTime();
String token = JWT.create()
.withHeader(map)
.withIssuer("issuer")
.withSubject("subject")
.withClaim("username",username)
.withClaim("loginTime", String.valueOf(loginTime))
.withExpiresAt(expires)
.sign(Algorithm.HMAC256(KEY));
return token;
}
/**
* 校验token有效性
* @param token
* @return
*/
public static Map<String, Claim> verifyToken(String token) throws UnsupportedEncodingException {
DecodedJWT jwt = null;
try {
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(KEY)).build();
jwt = jwtVerifier.verify(token);
} catch (Exception e){
e.printStackTrace();
}
return jwt.getClaims();
}
编辑于2018-11-24 -
[上海|结业弟子]JAVA-胡畔0
<!--token-->
<!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>导这个包,claims是jjwt封装好的一个创建token的方法
编辑于2019-08-02
- 去第 页