在项目开发过程中为了快速实现功能的开发,常常用到一些自建的工具类处理逻辑,本篇主要罗列了一些好用的自建工具类分享。
一。随机生成验证码工具类
/**
* 随机生成验证码工具类
*/
public class ValidateCodeUtils {
/**
* 随机生成验证码
* @param length 长度为4位或者6位
* @return
*/
public static Integer generateValidateCode(int length){
Integer code =null;
if(length == 4){
code = new Random().nextInt(9999);//生成随机数,最大为9999
if(code < 1000){
code = code + 1000;//保证随机数为4位数字
}
}else if(length == 6){
code = new Random().nextInt(999999);//生成随机数,最大为999999
if(code < 100000){
code = code + 100000;//保证随机数为6位数字
}
}else{
throw new RuntimeException("只能生成4位或6位数字验证码");
}
return code;
}
/**
* 随机生成指定长度字符串验证码
* @param length 长度
* @return
*/
public static String generateValidateCode4String(int length){
Random rdm = new Random();
String hash1 = Integer.toHexString(rdm.nextInt());
String capstr = hash1.substring(0, length);
return capstr;
}
}
二。日期格式化工具类
public class CommonUtil
{
/**
* 获得格式化的日期
* @return
*/
public static String getDateToString()
{
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String d1 = formatter.format(date);
if (null != d1 && !"".equals(d1))
return d1;
else return null;
}
/**
* 获得格式化的日期
* @return
*/
public static String getDateToString(Date date)
{
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String d1 = formatter.format(date);
if (null != d1 && !"".equals(d1))
return d1;
else return null;
}
/**
* 获得格式化的日期
* @return
* @throws ParseException
*/
public static Date getStringToDate(String date) throws ParseException
{
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
if (date != null && !"".equals(date))
{
Date d1 = formatter.parse(date);
return d1;
} else
{
return null;
}
}
/**
* 获得格式化的日期
* @return
* @throws ParseException
*/
public static Date getStringToAllDate(String date) throws ParseException
{
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (date != null && !"".equals(date))
{
Date d1 = formatter.parse(date);
return d1;
} else
{
return null;
}
}
/*
* @MethodName: isEmptyStr
* @Param: Object 待判断是否为空字符串
* @Description: 判断字符串是否为空,是:true,否:false
* @Author: chouei
* @Date: 2020/7/10 10:28
*/
public final static boolean isEmptyStr(Object obj)
{
if (obj != null && !"".equals(obj.toString().trim()) && !"null".equals(obj.toString()))
{
return false;
}
return true;
}
/*
* @MethodName: isNumeric
* @Param: parm
* @Description: 判断字符串是否为数字
* @Author: chouei
* @Date: 2020/7/13 21:42
*/
public static boolean isNumeric(String parm)
{
Pattern pattern = Pattern.compile("[0-9]*");
return pattern.matcher(parm).matches();
}
public static boolean isNumericDec(String parm)
{
if ("0".equals(parm))
{
return true;
}
Pattern pattern = Pattern.compile("\\d+\\.\\d+$|-\\d+\\.\\d+$");
return pattern.matcher(parm).matches();
}
public static String toUtf8String(String s) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c >= 0 && c <= 255) {
sb.append(c);
} else {
byte[] b;
try {
b = Character.toString(c).getBytes("utf-8");
} catch (Exception ex) {
System.out.println(ex);
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0)
k += 256;
sb.append("%" + Integer.toHexString(k).toUpperCase());
}
}
}
return sb.toString();
}
}
三。AESUtils 加密
public class AESUtils
{
//密钥 (需要前端和后端保持一致)
private static final String KEY = "abcdefgabcdefg12";
//算法
private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
/**
* aes解密
* @param encrypt 内容
* @return
* @throws Exception
*/
public static String aesDecrypt(String encrypt) {
try {
return aesDecrypt(encrypt, KEY);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* aes加密
* @param content
* @return
* @throws Exception
*/
public static String aesEncrypt(String content) {
try {
return aesEncrypt(content, KEY);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 将byte[]转为各种进制的字符串
* @param bytes byte[]
* @param radix 可以转换进制的范围,从Character.MIN_RADIX到Character.MAX_RADIX,超出范围后变为10进制
* @return 转换后的字符串
*/
public static String binary(byte[] bytes, int radix){
return new BigInteger(1, bytes).toString(radix);// 这里的1代表正数
}
/**
* base 64 encode
* @param bytes 待编码的byte[]
* @return 编码后的base 64 code
*/
public static String base64Encode(byte[] bytes){
return Base64.encodeBase64String(bytes);
}
/**
* base 64 decode
* @param base64Code 待解码的base 64 code
* @return 解码后的byte[]
* @throws Exception
*/
public static byte[] base64Decode(String base64Code) throws Exception{
return StringUtils.isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code);
}
/**
* AES加密
* @param content 待加密的内容
* @param encryptKey 加密密钥
* @return 加密后的byte[]
* @throws Exception
*/
public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
secureRandom.setSeed(KEY.getBytes());
kgen.init(128, secureRandom);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
return cipher.doFinal(content.getBytes("utf-8"));
}
/**
* AES加密为base 64 code
* @param content 待加密的内容
* @param encryptKey 加密密钥
* @return 加密后的base 64 code
* @throws Exception
*/
public static String aesEncrypt(String content, String encryptKey) throws Exception {
return base64Encode(aesEncryptToBytes(content, encryptKey));
}
/**
* AES解密
* @param encryptBytes 待解密的byte[]
* @param decryptKey 解密密钥
* @return 解密后的String
* @throws Exception
*/
public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
//防止linux下 随机生成key
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
secureRandom.setSeed(KEY.getBytes());
kgen.init(128, secureRandom);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
byte[] decryptBytes = cipher.doFinal(encryptBytes);
return new String(decryptBytes);
}
/**
* 将base 64 code AES解密
* @param encryptStr 待解密的base 64 code
* @param decryptKey 解密密钥
* @return 解密后的string
* @throws Exception
*/
public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception {
return StringUtils.isEmpty(encryptStr) ? null : aesDecryptByBytes(base64Decode(encryptStr), decryptKey);
}
/**
* 测试
*/
public static void main(String[] args) throws Exception {
String content = "哈哈结案圣诞节克拉斯打火机卡圣诞节asdasdasd阿斯达四asdasd大所大所";
System.out.println("加密前:" + content);
String encrypt = aesEncrypt(content);
System.out.println("加密后:" + encrypt);
String decrypt = aesDecrypt("VtPDY18v+44YXCaJ8Q+SBA==");
System.out.println("解密后:" + decrypt);
}
}
四。MD5Util加密
public class MD5Util
{
private static final Integer SALT_LENGTH = Integer.valueOf(12);
public static boolean validPassword(String password, String passwordInDb) throws Exception
{
try
{
byte[] e = SystemSecurityUtil.hexStringToByte(passwordInDb);
byte[] salt = new byte[SALT_LENGTH.intValue()];
System.arraycopy(e, 0, salt, 0, SALT_LENGTH.intValue());
byte[] digest = encrypte(salt, password);
byte[] digestInDb = new byte[e.length - SALT_LENGTH.intValue()];
System.arraycopy(e, SALT_LENGTH.intValue(), digestInDb, 0, digestInDb.length);
return Arrays.equals(digest, digestInDb);
} catch (Exception arg5)
{
throw new Exception("密码验证失败", arg5);
}
}
public static String getEncryptedPwd(String password) throws Exception
{
try
{
Object e = null;
SecureRandom random = new SecureRandom();
byte[] salt = new byte[SALT_LENGTH.intValue()];
random.nextBytes(salt);
byte[] digest = encrypte(salt, password);
byte[] e1 = new byte[digest.length + SALT_LENGTH.intValue()];
System.arraycopy(salt, 0, e1, 0, SALT_LENGTH.intValue());
System.arraycopy(digest, 0, e1, SALT_LENGTH.intValue(), digest.length);
return SystemSecurityUtil.byteToHexString(e1);
} catch (Exception arg4)
{
throw new Exception("获取加密密码失败", arg4);
}
}
public static byte[] encrypte(byte[] salt, String passwrod) throws Exception
{
try
{
MessageDigest e = null;
e = MessageDigest.getInstance("MD5");
e.update(salt);
e.update(passwrod.getBytes("UTF-8"));
return e.digest();
} catch (Exception arg2)
{
throw new Exception("Md5解密失败");
}
}
}
五。时间比较类
public class DateCompareUtil {
/**
* 两个时间之间相差距离多少天
* @param starttime:
* @param endtime:
* @return 相差天数
*/
public static long getDistanceDays(String starttime, String endtime) throws Exception{
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date one;
Date two;
long days=0;
try {
one = df.parse(starttime);
two = df.parse(endtime);
long time1 = one.getTime();
long time2 = two.getTime();
long diff ;
diff = time2 - time1;
days = diff / (1000 * 60 * 60 * 24);
} catch (ParseException e) {
e.printStackTrace();
}
return days;//返回相差多少天
}
/**
* 两个时间相差距离多少天多少小时多少分多少秒
* @param starttime 格式:1990-01-01 12:00:00
* @param endtime:2009-01-01 12:00:00
* @return long[] 返回值为:{天, 时, 分, 秒}
*/
public static long[] getDistanceTimes(String starttime, String endtime) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date one;
Date two;
long day = 0;
long hour = 0;
long min = 0;
long sec = 0;
try {
one = df.parse(starttime);
two = df.parse(endtime);
long time1 = one.getTime();
long time2 = two.getTime();
long diff ;
if(time1<time2) {
diff = time2 - time1;
} else {
diff = time1 - time2;
}
day = diff / (24 * 60 * 60 * 1000);
hour = (diff / (60 * 60 * 1000) - day * 24);
min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
sec = (diff/1000-day*24*60*60-hour*60*60-min*60);
} catch (ParseException e) {
e.printStackTrace();
}
long[] times = {day, hour, min, sec};
return times;
}
/**
* 两个时间相差距离多少天多少小时多少分多少秒
* @param starttime 1 格式:1990-01-01 12:00:00
* @param endtime 2 格式:2009-01-01 12:00:00
* @return String 返回值为:xx天xx小时xx分xx秒
*/
public static String getDistanceTime(String starttime, String endtime) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date one;
Date two;
long day = 0;
long hour = 0;
long min = 0;
long sec = 0;
try {
one = df.parse(starttime);
two = df.parse(endtime);
long time1 = one.getTime();
long time2 = two.getTime();
long diff ;
if(time1<time2) {
diff = time2 - time1;
} else {
diff = time1 - time2;
}
day = diff / (24 * 60 * 60 * 1000);
hour = (diff / (60 * 60 * 1000) - day * 24);
min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
sec = (diff/1000-day*24*60*60-hour*60*60-min*60);
} catch (ParseException e) {
e.printStackTrace();
}
return day + "天" + hour + "小时" + min + "分" + sec + "秒";
}
}
六。JWT token生成和校验
public class AppJwtUtil {
// TOKEN的有效期一天(S)
private static final int TOKEN_TIME_OUT = 3_600;
// 加密KEY
private static final String TOKEN_ENCRY_KEY = "MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY";
// 最小刷新间隔(S)
private static final int REFRESH_TIME = 300;
// 生产ID
public static String getToken(Long id){
Map<String, Object> claimMaps = new HashMap<>();
claimMaps.put("id",id);
long currentTime = System.currentTimeMillis();
return Jwts.builder()
.setId(UUID.randomUUID().toString())
.setIssuedAt(new Date(currentTime)) //签发时间
.setSubject("system") //说明
.setIssuer("heima") //签发者信息
.setAudience("app") //接收用户
.compressWith(CompressionCodecs.GZIP) //数据压缩方式
.signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式
.setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000)) //过期时间戳
.addClaims(claimMaps) //cla信息
.compact();
}
*
* 获取token中的claims信息
*
* @param token
* @return
private static Jws<Claims> getJws(String token) {
return Jwts.parser()
.setSigningKey(generalKey())
.parseClaimsJws(token);
}
*
* 获取payload body信息
*
* @param token
* @return
public static Claims getClaimsBody(String token) {
try {
return getJws(token).getBody();
}catch (ExpiredJwtException e){
return null;
}
}
*
* 获取hearder body信息
*
* @param token
* @return
public static JwsHeader getHeaderBody(String token) {
return getJws(token).getHeader();
}
*
* 是否过期
*
* @param claims
* @return -1:有效,0:有效,1:过期,2:过期
public static int verifyToken(Claims claims) {
if(claims==null){
return 1;
}
try {
claims.getExpiration()
.before(new Date());
// 需要自动刷新TOKEN
if((claims.getExpiration().getTime()-System.currentTimeMillis())>REFRESH_TIME*1000){
return -1;
}else {
return 0;
}
} catch (ExpiredJwtException ex) {
return 1;
}catch (Exception e){
return 2;
}
}
*
* 由字符串生成加密key
*
* @return
public static SecretKey generalKey() {
byte[] encodedKey = Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
return key;
}
public static void main(String[] args) {
Map map = new HashMap();
map.put("id","11");
System.out.println(AppJwtUtil.getToken(1102L));
Jws<Claims> jws = AppJwtUtil.getJws("eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWL0QrDIAwA_yXPFUwXdfZvokmZg4KghY2xf1_6sLc7jvvAczbYoBLXcvfRKa3iyGdx2Ut1SfaCst9UU4QFGk_YMAaiHEKKC4yz2D3eY-px9TFMH9oONuNTzLh3Y331_5nxOps1RL9-fxG8CXCDAAAA.NOyJExqo7FmpHllY47jIWZoMp6SGMZkPr8YFaa45LKHtlcUGV54RPoPBTEzI6039JjwTAfKWrPiBN7dmYM5AQA");
Claims claims = jws.getBody();
System.out.println(claims.get("id"));
}
}
持续更新,未完待续