常用自建工具类分享

     在项目开发过程中为了快速实现功能的开发,常常用到一些自建的工具类处理逻辑,本篇主要罗列了一些好用的自建工具类分享。

一。随机生成验证码工具类

/**
 * 随机生成验证码工具类
 */
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"));

    }

}

持续更新,未完待续

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值