常见加密算法以及安全级别和使用场景。

DES(安全级别不高,消耗性能 较小)

AES(安全级别较高)

MD5(安全级别较高,一般不用做加密,常用在校验文件)

RSA(安全级别特别高,消耗性能大)

SHA(不可解密,一般用在签名)

Aes工具类:

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;import cn.hutool.crypto.Mode;
import cn.hutool.crypto.Padding;
import cn.hutool.crypto.symmetric.AES;/*** Aes加解密*/
public class AesUtil {private static final Logger logger = LogManager.getLogger("AESUtil");private static final String CHARSET = "UTF-8";public static String base64Encode(byte[] bytes) {return Base64.encodeBase64String(bytes);}public static byte[] base64Decode(String base64Code) throws Exception {return Base64.decodeBase64(base64Code.getBytes(CHARSET));}/*** 加密** @param content* @param encryptKey* @return* @throws Exception*/public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {initEncryptCipher(encryptKey);return encryptCipher.doFinal(content.getBytes(CHARSET));}/*** 加密** @param content* @param encryptKey* @return* @throws Exception*/public static byte[] aesEncryptToBytes(byte[] content, String encryptKey) throws Exception {initEncryptCipher(encryptKey);return encryptCipher.doFinal(content);}/*** 加密转字符** @param content* @param encryptKey* @return* @throws Exception*/public static String aesEncrypt(String content, String encryptKey) throws Exception {return base64Encode(aesEncryptToBytes(content, encryptKey));}/*** 解密** @param content* @param decryptKey* @return* @throws Exception*/public static byte[] aesDecryptByBytes(String content, String decryptKey) throws Exception {initDecryptCipher(decryptKey);return decryptCipher.doFinal(content.getBytes(CHARSET));}/*** 解密** @param content* @param decryptKey* @return* @throws Exception*/public static byte[] aesDecryptByBytes(byte[] content, String decryptKey) throws Exception {initDecryptCipher(decryptKey);return decryptCipher.doFinal(content);}public static String aesDecrypt(String content, String decryptKey) throws Exception {return new String(aesDecryptByBytes(base64Decode(content), decryptKey));}private static Cipher encryptCipher = null;private static Cipher decryptCipher = null;public static void initEncryptCipher(String aesKey) throws Exception {if (encryptCipher == null) {//5.根据字节数组生成AES密钥SecretKeySpec skeySpec = new SecretKeySpec(Hex.decodeHex(aesKey.toCharArray()), "AES");//6.根据指定算法AES自成密码器encryptCipher = Cipher.getInstance("AES");//7.初始化密码器encryptCipher.init(Cipher.ENCRYPT_MODE, skeySpec);}}public static void initDecryptCipher(String aesKey) throws Exception {if (decryptCipher == null) {//5.根据字节数组生成AES密钥SecretKeySpec skeySpec = new SecretKeySpec(Hex.decodeHex(aesKey.toCharArray()), "AES");//6.根据指定算法AES自成密码器decryptCipher = Cipher.getInstance("AES");//7.初始化密码器decryptCipher.init(Cipher.DECRYPT_MODE, skeySpec);}}public static String hutoolEncrpt(String content,String key){AES aes=new AES(Mode.ECB, Padding.ISO10126Padding, key.getBytes());return aes.encryptBase64(content);}public static String hutoolDecrpt(String content,String key){AES aes=new AES(Mode.ECB, Padding.ISO10126Padding, key.getBytes());return aes.decryptStr(content);}public static void main(String[] args) throws Exception {final String KEY = "2423424dsfsdfsdfdsfdsgfdfdfs4";String privateKeyStr = "管理员";String encrypt = aesEncrypt(privateKeyStr, KEY);logger.info("加密后:" + encrypt);String decrypt = aesDecrypt(encrypt, KEY);logger.info("解密后:" + decrypt);}}

Des3工具类:

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Base64;import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;import org.bouncycastle.util.encoders.Hex;import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;@Slf4j
public class Des3Utils {/*** 加密算法*/private static final String KEY_ALGORITHM = "DESede";private static final String CIPHER_ALGORITHM = "DESede/CBC/PKCS5Padding";/*** 3DES 加密* @param key   秘钥(24位)* @param iv    偏移量* @param data  需要加密的字符串* @return 返回加密的字符串*/public static String encrypt(String key, String iv, String data) {try {DESedeKeySpec spec = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8));SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);Key deskey = keyfactory.generateSecret(spec);Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);IvParameterSpec ips = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);byte[] bOut = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));Base64.Encoder encoder = Base64.getMimeEncoder();return encoder.encodeToString(bOut);} catch (Exception e) {e.printStackTrace();log.error("3DES 解密错误:{}", e);throw new RuntimeException("3DES 解密错误");}}/*** 3DES 解密* @param key   秘钥(24位)* @param iv    偏移量* @param data  需要解密的密文* @return 返回加密的字符串*/public static String decrypt(String key, String iv, String data) {try {DESedeKeySpec spec = new DESedeKeySpec(key.getBytes(StandardCharsets.UTF_8));SecretKeyFactory keyfactory = SecretKeyFactory.getInstance(KEY_ALGORITHM);Key deskey = keyfactory.generateSecret(spec);Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);IvParameterSpec ips = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));cipher.init(Cipher.DECRYPT_MODE, deskey, ips);byte[] bOut = cipher.doFinal(getBase64Decode(data));return new String(bOut, StandardCharsets.UTF_8);} catch (Exception e) {e.printStackTrace();log.error("3DES 解密错误:{}", e);throw new RuntimeException("3DES 解密错误");}}/*** * @param src* @param secretKey* @return*/public static String get3DESEncryptECB(String src, String secretKey) {try {Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");cipher.init(1, new SecretKeySpec(build3DesKey(secretKey), "DESede"));String base64Encode = getBase64Encode(cipher.doFinal(src.getBytes("UTF-8")));return filter(base64Encode);} catch (Exception var4) {return null;}}/*** * @param src* @param secretKey* @return*/public static String get3DESDecryptECB(String src, String secretKey) {try {Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");cipher.init(2, new SecretKeySpec(build3DesKey(secretKey), "DESede"));byte[] base64DValue = getBase64Decode(src);byte[] ciphertext = cipher.doFinal(base64DValue);return new String(ciphertext, "UTF-8");} catch (Exception var5) {return null;}}public static byte[] getBase64Decode(String str) {byte[] src = null;try {Base64.Decoder decoder = Base64.getMimeDecoder();src = decoder.decode(str);} catch (Exception var3) {var3.printStackTrace();}return src;}public static String getBase64Encode(byte[] src) {String requestValue = "";try {Base64.Encoder encoder = Base64.getMimeEncoder();requestValue = filter(encoder.encodeToString(src));} catch (Exception var3) {var3.printStackTrace();}return requestValue;}public static byte[] build3DesKey(String keyStr) throws UnsupportedEncodingException {byte[] key = new byte[24];byte[] temp = keyStr.getBytes("UTF-8");if (key.length > temp.length) {System.arraycopy(temp, 0, key, 0, temp.length);} else {System.arraycopy(temp, 0, key, 0, key.length);}return key;}private static String filter(String str) {String output = null;StringBuffer sb = new StringBuffer();for(int i = 0; i < str.length(); ++i) {int asc = str.charAt(i);if (asc != '\n' && asc != '\r') {sb.append(str.subSequence(i, i + 1));}}output = new String(sb);return output;}public static String byteToHexString(byte[] bytes) {StringBuffer sb = new StringBuffer();for(int i = 0; i < bytes.length; ++i) {String strHex = Integer.toHexString(bytes[i]);if (strHex.length() > 3) {sb.append(strHex.substring(6));} else if (strHex.length() < 2) {sb.append("0" + strHex);} else {sb.append(strHex);}}return sb.toString();}/*** 将data中的密文Hex后3DES解码* @param content* @param key* @return*/public static String reHexAndDecrypt(String content, String key) {if(StrUtil.isBlank(content)) {return null;}byte[] hexBytes = Hex.decode(content.getBytes(StandardCharsets.UTF_8));String baseReqStr = getBase64Encode(hexBytes);String outInfo = Des3Utils.get3DESDecryptECB(baseReqStr, key);return outInfo;}}

MD5工具类

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;import cn.ctg.common.util.ByteUtil;
import cn.ctg.common.util.ErrorUtil;
import lombok.extern.slf4j.Slf4j;/*** MD5 工具类*/
@Slf4j
public class MD5Util {/*** 生成MD5加密串*/public static String getMd5(String message) {String md5 = "";try {//创建一个md5算法对象MessageDigest md = MessageDigest.getInstance("MD5");byte[] messageByte = message.getBytes(StandardCharsets.UTF_8);//获得MD5字节数组,16*8=128位byte[] md5Byte = md.digest(messageByte);//转换为16进制字符串md5 = ByteUtil.bytesToHex(md5Byte);} catch (Exception e) {//输出到日志文件中log.error(ErrorUtil.errorInfoToString(e));}return md5;}/*** 验证方法* @param text 明文* @param md5 密文* @return 对比结果*/private static boolean verify(String text,String md5){return md5.equals(getMd5(text));}public static void main(String[] args) {System.out.print(MD5Util.getMd5("maoheyere@cn"));}
}

RSA工具类

import cn.hutool.jwt.JWTUtil;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.ArrayUtils;
import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;/*** RSA加解密*/
public class RsaUtils {/*** RSA最大加密明文大小*/private static final int MAX_ENCRYPT_BLOCK = 117;/*** RSA最大解密密文大小*/private static final int MAX_DECRYPT_BLOCK = 128;public static final String SIGN_ALGORITHMS = "SHA256withRSA";private static String ALGORITHM_RSA = "RSA";/*** 私钥加签名* @param encryptData* @param privateKey* @return*/public static String rsaSign(String encryptData, String privateKey) {try {Signature signature = Signature.getInstance(SIGN_ALGORITHMS);signature.initSign(loadPrivateKey(privateKey));signature.update(encryptData.getBytes());byte[] signed = signature.sign();return Base64.encodeBase64URLSafeString(signed);} catch (Exception e) {e.printStackTrace();}return null;}/*** 公钥验签* @param encryptStr* @param sign* @param publicKey* @return* @throws Exception*/public static boolean verifySign(String encryptStr, String sign, String publicKey)throws Exception {try {Signature signature = Signature.getInstance(SIGN_ALGORITHMS);signature.initVerify(loadPublicKey(publicKey));signature.update(encryptStr.getBytes());return signature.verify(Base64.decodeBase64(sign));}  catch (NoSuchAlgorithmException e) {throw new Exception(String.format("验证数字签名时没有[%s]此类算法", SIGN_ALGORITHMS));} catch (InvalidKeyException e) {throw new Exception("验证数字签名时公钥无效");} catch (SignatureException e) {throw new Exception("验证数字签名时出现异常");}}public static PublicKey loadPublicKey(String publicKeyStr) throws Exception {byte[] buffer = Base64.decodeBase64(publicKeyStr);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_RSA);X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);return keyFactory.generatePublic(keySpec);}public static PrivateKey loadPrivateKey(String privateKeyStr) throws Exception {byte[] buffer = Base64.decodeBase64(privateKeyStr);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM_RSA);return keyFactory.generatePrivate(keySpec);}/*** @Description RSA解密*/protected static String rsaEncrypt(String sourceData, String key,boolean isPrivate){try {Key key1 = isPrivate ? loadPrivateKey(key) : loadPublicKey(key);byte[] data = sourceData.getBytes();byte[] dataReturn = new byte[0];Cipher cipher = Cipher.getInstance(ALGORITHM_RSA);cipher.init(Cipher.ENCRYPT_MODE, key1);// 加密时超过117字节就报错。为此采用分段加密的办法来加密StringBuilder sb = new StringBuilder();for (int i = 0; i < data.length; i += MAX_ENCRYPT_BLOCK) {byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(data, i,i + MAX_ENCRYPT_BLOCK));sb.append(new String(doFinal));dataReturn = ArrayUtils.addAll(dataReturn, doFinal);}return Base64.encodeBase64URLSafeString(dataReturn);} catch (Exception e) {e.printStackTrace();return null;}}/*** @Description RSA解密*/protected static String rsaDecrypt(String encryptedData, String key,boolean isPrivate){try {Key key1 = isPrivate ? loadPrivateKey(key) : loadPublicKey(key);byte[] data = Base64.decodeBase64(encryptedData);Cipher cipher = Cipher.getInstance(ALGORITHM_RSA);cipher.init(Cipher.DECRYPT_MODE, key1);// 解密时超过128字节就报错。为此采用分段解密的办法来解密byte[] dataReturn = new byte[0];for (int i = 0; i < data.length; i += MAX_DECRYPT_BLOCK) {byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(data, i, i + MAX_DECRYPT_BLOCK));dataReturn = ArrayUtils.addAll(dataReturn, doFinal);}return new String(dataReturn);} catch (Exception e) {e.printStackTrace();return null;}}/*** 使用公钥将数据加密* @param sourceData* @param publicKey* @return*/public static String publicEncrypt(String sourceData, String publicKey){return rsaEncrypt(sourceData,publicKey,false);}/*** 使用私钥将数据加密* @param sourceData* @param privateKey* @return*/public static String privateEncrypt(String sourceData, String privateKey){return rsaEncrypt(sourceData,privateKey,true);}/*** 使用公钥解密* @param encryptedData* @param privateKey* @return*/public static String publicDecrypt(String encryptedData, String privateKey) {return rsaDecrypt(encryptedData,privateKey,false);}/*** 使用私钥解密* @param encryptedData* @param privateKey* @return*/public static String privateDecrypt(String encryptedData, String privateKey) {return rsaDecrypt(encryptedData,privateKey,true);}public static void main(String[] args) {String password = "123456";Map<String,Object> map=new HashMap<>();map.put("user_id","5353453453");map.put("sessionKey","123553444");String message = JWTUtil.createToken(map, password.getBytes());try {String publicKeyStr = "MIGfMA0GCSqGSIb3DQEHHQUAA4GNADCBiQKBgQC6BSDlbRplhMMNZBKHX4xe8AwE" +"SpzHVfAcHHsX9FFSMuF91W3cxgT/g5n+qlLLFzCE3hWG/yX5NMAxR4mS3MlhyXKw" +"ko3tK9Ua691afod1lxORR3IaZ8nV7v5Bv8y4JDe4E3/f/bQIGzroWiJ0sXTcO41G" +"qvOw3G9leClSvjVnSwIDAQAB";String privateKeyStr = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALoFIOVtGmWEww1k" +"EodfjF7wDARKnMdV8Bwcexf0UVIy4X3VbdzGBP+Dmf6qUssXMITeFYb/Jfk0wDFH" +"iZLcyWHJcrCSje0r1Rrr3Vp+h3WXE5FHchpnydXu/kG/zLgkN7gTf9/9tAgbOuha" +"InSxdNw7jUaq87dsb2V4KVK+NWdLAgMBAAECgYBqCihhgJtOiarjBEvnrZkIOZCw" +"FZRfsWaJr9afph+BWw3dvH+/HYaV3YA4gwFlUlfPNgZRiTstX1u7+8q51HBa+08h" +"jPE8Q4GhoUY+sQ9MB8NXA6SWHNPPfMOYIeKEtKmNBdgIbtuhnob3o18rJNFIY+qC" +"i8djf4om93+AChmo6QJBAO31hd9qem7BnHXsxiMwS+iHlRjW9KxXva2zf+BNURSR" +"Z19cePReHJGE4v1C731MZlygTB5zKChQ8uZ3JLKJeX8CQQDIH4k/xbuhMb8dMdzl" +"AYN/CU+MgfWjlgbYjxOnTaLcbs5Mlz9v3/5I/FwqxPvzGuCjHkyh08oFfnQXvzdj" +"YMA1AkEApjgyOnzzZvisdXJueVgcPiKvSHmm0dg8W+Cd+72mXHqxPdCngPNYe2Ha" +"+VRPXDQI8LzcTwzbyUW6Vrh0/u2+2wJBAK1rZqx01VuimFLcWue4oBL+JolENXFF" +"GTmhAw8AIBmVjACjML3qBZmJ1vTZLtxEdlXkc9PojDCmnEPX2E+uD+ECQF2eX4EY" +"X95HDzQ4cm1kGQudjgfH1gZ+30DIingfHXNAOFpYeAUD7yUQP5tZO8nG38gybPJg" +"FoadlsSMIQIpksM=";//加密String privateEncryptStr = privateEncrypt(message, privateKeyStr);String publicEncryptStr = publicEncrypt(message, publicKeyStr);String privateEncryptSign = rsaSign(privateEncryptStr,privateKeyStr);String publicEncryptSign = rsaSign(publicEncryptStr,privateKeyStr);System.out.println("source:" + message);System.out.println("private encryptStr: " + privateEncryptStr);System.out.println("public encryptStr: " + publicEncryptStr);System.out.println("private encrypt sign: " + privateEncryptSign);System.out.println("public encrypt sign: " + publicEncryptSign);System.out.println("public decrypt:" + publicDecrypt(privateEncryptStr, publicKeyStr));System.out.println("private decrypt:" + privateDecrypt(publicEncryptStr, privateKeyStr));System.out.println("verifySign1: " + verifySign(privateEncryptStr,privateEncryptSign,publicKeyStr));System.out.println("verifySign2: " + verifySign(publicEncryptStr,publicEncryptSign,publicKeyStr));} catch (Exception e) {e.printStackTrace();}}
}

SHA_1工具类

import java.security.MessageDigest;
import java.util.Base64;/*** SHA非对称加密算法(不可解密)*/
public class SHAUtils {// ASC 加密秘钥/*** SHA非对称加密算法* * @param spara* @return*/public static String getSHA(String spara) {String sRtn = null;try {byte[] plainText = spara.getBytes("UTF8");// 使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");// 开始使用算法messageDigest.update(plainText);// 输出算法运算结果Base64.Encoder encoder = Base64.getMimeEncoder();sRtn = encoder.encodeToString(messageDigest.digest());
//          sRtn = new BASE64Encoder().encode(messageDigest.digest());} catch (Exception e) {e.printStackTrace();}return sRtn;}// 测试public static void main(String[] args) throws Exception {String sourceStr = "86-15013658624";String s = getSHA(sourceStr);System.out.println(s);}}

token工具类

import cn.lzscxb.entity.exception.ConditionException;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.SignatureVerificationException;
import com.auth0.jwt.exceptions.TokenExpiredException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;import java.util.Calendar;
import java.util.Date;
import java.util.Map;@Slf4j
public class TokenUtils {private static final String ISSUER = "mhyr.cn";private static final Integer EXPIRE =30 ;/*** 生成token** @param userId* @return* @throws Exception*/public static String generateToken(Long userId, String phone, String avatar, String nickname) {Algorithm algorithm = null;try {algorithm = Algorithm.RSA256(RSAUtils.getPublicKey(), RSAUtils.getPrivateKey());} catch (Exception e) {throw new RuntimeException(e);}Calendar calendar = Calendar.getInstance(); // 日历类用于生成过期时间calendar.setTime(new Date());calendar.add(Calendar.SECOND, EXPIRE);return JWT.create().withKeyId(String.valueOf(userId)).withIssuer(ISSUER).withExpiresAt(calendar.getTime()).withClaim("user_id", userId).withClaim("phone", phone).withClaim("avatar", avatar).withClaim("nickname", nickname).sign(algorithm);}public static Map<String, Claim> VerifyToken(String token) {try {Algorithm algorithm = Algorithm.RSA256(RSAUtils.getPublicKey(), RSAUtils.getPrivateKey());JWTVerifier verifier = JWT.require(algorithm).build();DecodedJWT jwt = verifier.verify(token);Map<String, Claim> claims = jwt.getClaims();return claims;} catch (TokenExpiredException e) {throw new ConditionException(401, "token 令牌已过期");} catch (SignatureVerificationException e) {e.printStackTrace();log.info(token);throw new ConditionException(401, "token 令牌无效");} catch (Exception e) {throw new RuntimeException(e);}}}

JAVA架构之路(数据加密与常见加密算法)相关推荐

  1. JAVA架构之路(二)

    java web架构有多少人能说清楚自己项目中真实的架构模式.在网络上很多是这样的, 早期是: SSH(Spring+struts2+Hibernate) SSM(Spring+struts2+Myb ...

  2. java架构之路(多线程)synchronized详解以及锁的膨胀升级过程

    4: astore_1 5: monitorenter 6: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream; 9: l ...

  3. JAVA架构之路(DDD架构模型)

    DDD(domain-driven design)领域驱动设计.虽然名字看上去有点新,其实也是内容也是我们常见的,它也可以说微服务思想的一个范畴. 领域驱动设计,这里的领域,可能是一块功能,一项技术, ...

  4. JAVA架构之路(设计模式之观察者模式)

    设计模式之观察者模式 定义:对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 核心原理: 1.被观察者中维护一个观察者对象列表 2.观察者可新增可可移 ...

  5. “热榜第一”阿里年薪80W的Java架构师,到底是有着怎样的水平?

    前言 提到IT人员,人们的第一印象就是高薪资,包括转行来学Java的人绝大多数都是冲着高薪以及就业广泛来的. 前段时间跟同学聊天,她说她老公在一家互联网公司做Java后台开发,年薪四十万,最近在准备复 ...

  6. 视频教程-Java架构师之路:分布式面试题-Java

    Java架构师之路:分布式面试题 动力节点王勇老师,CCTV<影响力对话>栏目特约嘉宾,Java培训知名讲师,中国Java培训领军人物,北京动力节点创始人,董事长兼CEO.1995年接触软 ...

  7. java架构师之路:JAVA程序员必看的15本书的电子版下载地址

    java架构师之路:JAVA程序员必看的15本书的电子版下载地址 作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一 ...

  8. 我要带徒弟学写JAVA架构,引路架构师之路

    带徒弟学JAVA架构 Java程序员如何打破工作2,3年的瓶颈问题,如何更上一层楼? 太多的巧合,让我接触到了开源,通过JEECG与很多朋友交流后,让我有了帮助别人学习底层架构的想法. 很多人做jav ...

  9. 我要带徒弟学写JAVA架构,引路架构师之路(Jeecg开源社区)

    带徒弟学JAVA架构(Jeecg社区)      Java程序员如何打破工作2,3年的瓶颈问题,如何更上一层楼?      太多的巧合,让我接触到了开源,通过JEECG与很多朋友交流后,让我有了帮助别 ...

最新文章

  1. 「二本生逆袭」引知乎热议,读博后三年两次发Nature,第一学历有那么重要吗?...
  2. 全球首款AI的操作系统来了!100%国产,像用Windows一样简单
  3. 如何用asp.net实现校验功能!
  4. 完整mes代码(含客户端和server端_200行代码实现基于paxos的kv存储
  5. python getopts_linux bash shell 中getopts 命令 和 python 中 getopt 函数的比较总结
  6. iOS之深入解析图片解压缩到渲染的过程与原理
  7. 各种排序算法稳定性的探讨
  8. JSP之【include】指令
  9. 浅析Secondary NameNode与namenode
  10. Cheat Engine(CE)教程
  11. 车机鸿蒙系统 车型,华为鸿蒙车机系统提前曝光!首发车型是它?
  12. widnows下lua开发环境luadist LuaRocks搭建
  13. Port vlan Tag vlan
  14. Chapter3:Gradle依赖管理
  15. Chrome插件安装的3种方法,解决拖放不能安装的情况,并提供插件下载
  16. python提取XML信息保存为txt
  17. 【每日训练】排序子序列
  18. 线性代数及其应用:经典矩阵特征值证明
  19. 简单20行代码爬取王者荣耀官网1080p壁纸
  20. 使用决策树对鸢尾花进行分类

热门文章

  1. Unity之Shader基础探索
  2. mysql总是出乱码怎么办_mysql数据库出现乱码怎么办
  3. python模拟点击后获取状态码_Python获取网页状态码
  4. Python爬虫的学习
  5. Pytest 基础教程
  6. 百度地图API乡镇级别行政区划
  7. 三菱服务器显示rb是什么故障,三菱变频器常见的故障代码 以及故障说明
  8. EF Core 5.0原生sql语句执行
  9. 配置console口认证(华为/思科)
  10. 小滕要开始学习C语言啦