密码往往不便直接存放在数据库中,所以需要写一个MD5工具类,下面是写法
import java.security.MessageDigest;
/**
* 通用工具类
*/
public class CommonUtils {
/**
* MD5加密工具类
* @param data
* @return
*/
public static String MD5(String data) {
try {
java.security.MessageDigest md = MessageDigest.getInstance("MD5");
byte[] array = md.digest(data.getBytes("UTF-8"));
StringBuilder sb = new StringBuilder();
for (byte item : array) {
sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString().toUpperCase();
} catch (Exception exception) {
}
return null;
}
}
下面是JWT工具类
package net.xdclass.online_xdclass.utils;
/**
* @author Jjw
* @version 1.0
* @date 2022/3/31 22:50
* @useTo:
*/
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import net.xdclass.online_xdclass.model.entiy.User;
import java.util.Date;
/**
* Jwt工具类
* 注意点:
* 1、生成的token, 是可以通过base64进行解密出明文信息
* 2、base64进行解密出明文信息,修改再进行编码,则会解密失败
* 3、无法作废已颁布的token,除非改秘钥
*/
public class JWTUtils {
/**
* 过期时间,一周
*/
private static final long EXPIRE = 60000 * 60 * 24 * 7;
// private static final long EXPIRE = 1;
/**
* 加密秘钥
*/
private static final String SECRET = "xdclass.net168";
/**
* 令牌前缀
*/
private static final String TOKEN_PREFIX = "xdclass";
/**
* subject(主题)
*/
private static final String SUBJECT = "xdclass";
/**
* 根据用户信息,生成令牌(方法多种多样)
*/
public static String geneJsonWebToken(User user){
//token令牌的方法多种多样,但大部分都以Jwts.builder()开头,
// 以setIssuedAt+setExpiration+signWith结尾
String token= Jwts.builder().setSubject(SUBJECT)
.claim("head_img",user.getHeadImg())
.claim("id",user.getId())
.claim("name",user.getName())
.setIssuedAt(new Date())
// 失效时间currentTimeMillis获取毫秒
.setExpiration(new Date(System.currentTimeMillis()+EXPIRE))
//compact紧凑一些
.signWith(SignatureAlgorithm.HS256,SECRET).compact();
// 加个前缀
token=TOKEN_PREFIX+token;
return token;
}
public static Claims checkJWT(String token){
//parser专门解析密钥.setSigningKey用原来的密钥解密,
// parseClaimsJws把所有的信息解析成各种数据
// 因为可能存在解密失败,所以最好放在trycatch中
try {
final Claims claims= Jwts.parser().setSigningKey(SECRET)
.parseClaimsJws(token.replace(TOKEN_PREFIX,"")).getBody();
return claims;
}catch (Exception e){
return null;
}
}
}
对这个工具类的测试
package net.xdclass.online_xdclass;
import io.jsonwebtoken.Claims;
import net.xdclass.online_xdclass.model.entiy.User;
import net.xdclass.online_xdclass.utils.JWTUtils;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class OnlineXdclassApplicationTests {
/**
* 测试JWT工具类
*/
@Test
public void testGeneJwt() {
User user=new User();
user.setId(66);
user.setName("老王123");
user.setHeadImg("peng");
//过期时间测试
try {
Thread.sleep(4000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
String token= JWTUtils.geneJsonWebToken(user);
System.out.println(token);
Claims claims=JWTUtils.checkJWT(token);
System.out.println(claims.get("name"));
}
}