## JAVA常用工具类 #### HttpRequestUtil ##### 作用:对HttpReuquest对象进行操作的工具类 ```java public class HttpRequestUtil { /** * 获取请求IP地址 */ public static String getIpAddr(HttpServletRequest request) throws IOException { // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } } else if (ip.length() > 15) { String[] ips = ip.split(","); for (int index = 0; index < ips.length; index++) { String strIp = (String) ips[index]; if (!("unknown".equalsIgnoreCase(strIp))) { ip = strIp; break; } } } return ip; } /** * 获取代理信息 */ public static String getAgent(HttpServletRequest request){ return request.getHeader("user-agent"); } } ``` #### Base64ToMultipartFile ##### 作用:实现了MultipartFile接口 可以接受Base64编码后的文件 ```java /** * @author dss * @since 2022/8/8 */ public class Base64ToMultipartFile implements MultipartFile { private final byte[] fileContent; private final String extension; private final String contentType; private final String name; private final String id = "file_"+ UUID.randomUUID().toString(); public Base64ToMultipartFile(String base64,String name) { if (base64==null) throw new MyException(RestResponse.MSG.UPLOAD_EXCEPTION).setMsg("文件解析失败"); String[] split = base64.split(","); if (split==null||split.length!=2) throw new MyException(RestResponse.MSG.UPLOAD_EXCEPTION).setMsg("文件解析失败"); String uri = split[0]; String data = split[1]; try { this.fileContent = Base64.getDecoder().decode(data.getBytes(StandardCharsets.UTF_8)); }catch (IllegalArgumentException e){ throw new MyException(RestResponse.MSG.UPLOAD_EXCEPTION).setMsg("文件解析失败"); } this.extension = uri.split(";")[0].split("/")[1]; this.contentType = uri.split(";")[0].split(":")[1]; this.name=name; } /** * @param base64 * @param dataUri 格式类似于: data:image/png;base64 * @param name */ public Base64ToMultipartFile(String base64, String dataUri, String name) { try { this.fileContent = Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8)); }catch (IllegalArgumentException e){ throw new MyException(RestResponse.MSG.UPLOAD_EXCEPTION).setMsg("文件解析失败"); } this.extension = dataUri.split(";")[0].split("/")[1]; this.contentType = dataUri.split(";")[0].split(":")[1]; this.name = name; } public Base64ToMultipartFile(String base64, String extension, String contentType, String name) { try { this.fileContent = Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8)); }catch (IllegalArgumentException e){ throw new MyException(RestResponse.MSG.UPLOAD_EXCEPTION).setMsg("文件解析失败"); } this.extension = extension; this.contentType = contentType; this.name = name; } @Override public String getName() { if (name==null){ return id; } return name; } @Override public String getOriginalFilename() { if (name==null){ return id + "." + extension; } return name+"."+extension; } @Override public String getContentType() { return contentType; } @Override public boolean isEmpty() { return fileContent == null || fileContent.length == 0; } @Override public long getSize() { return fileContent.length; } @Override public byte[] getBytes() throws IOException { return fileContent; } @Override public ByteArrayInputStream getInputStream() throws IOException { return new ByteArrayInputStream(fileContent); } @Override public void transferTo(File file) throws IOException, IllegalStateException { try (FileOutputStream fos = new FileOutputStream(file)) { fos.write(fileContent); } } /** * 实列 */ public static void main(String[] args) { StringBuilder s = new StringBuilder("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAM0AAAByCAYAAADwIFXJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAA8jSURBVHhe7Z1bcty4DobPJr2ZeCnxCs55d3kbqTxnAZ49JH1IXCQABHTrltHK4K9ixS2RIKn+P5IWOeP/3Epp+vPnD/z769ev2+/fv+HnVf3zcXt9eb19/BN87vKudcH1t9vP9uPP7y+3l+/9J9bP29uLufbj7fbSrr396B8+bx/fXm6v759wK9Ln+yvFwHhYVghiYhsmifYO7YJ7Og7U8e2jtcjrx6zonn+9t9d5ZpPm/hc0iToLmsgss6GbwLzGJOqahWQLNJiHDQ7tIHNP8qCR1+x9+Kz70+NyO6K+dkm4pNwyPKBwfZDk8ylonkKPg4a/ZEzD6A6yIz9+thBMhurmUYZD08h6hrpcw3tgSmhMO0z/AJBv0vx6RngYNAyLuA75prYWNE+hM2Ya+KIdo3gG9vOiiQcghGkijfEcMNmcIumYsp7+c2+zAAX6O0PnAkDaD42EuQvbj8+hoHkKnbM8c4zaBEYRRpVJw8HQaMDWoeFyXrKzjzWn1rSMFID09vd2qiVmUwxN3N6C5sI663caMJYygPzypdAIngnHUXoFmggGaJ+oewM0Eyw9L7WNYWF4WCE0C/X4ZfozsgNFQfN0Ogsa/rKV4QIDqXtgNI6FMWZIlqAZ4Ztl7m2BBup+bb/LCEB6P9tSTS7NujwAsE/eIIGKQIPrYqDQnwuap9B50EjjLBm6Cco3M/z3f/ivhAIMrkfaeclFqZuKYkQmxbZQGzdBQ4ZV+ah+8zsK5jPJ5LGKoOlS8VScguYpdAiaUroKmkQVNNdUQZOoguaaKmgSVdBcUwVNogqaa6qgSVRBc00VNIkqaK6pgiZRBc01VdAk6iugWdwdp83Lxc1AziM2A7dtKDqboUEe95RBsGm7qKgMbb7KtvgnG0icP9gALWgSdT40ZMp+tN4zAADRj6tE5uzl8TjLAE1gKFBgOnUyAHQ+NP6gQUAHgwWUcY7ssAqaRJ0ODZioffH8L12eREdaPrpJPAh6uWasDwPJMjRkyOA+lJ3MejI08Dk63mPP1rGwTXz8yCtb0CTqEDR8dosMwcsN78uFERPMK0/rCqlYI1Td4N1UFpJFaNbMru7vhMb0+fX9Q/fLlMEZI156uvchBj4Lv58/C5pMHYemfZnyy6ZlljaqHin1CE9iaExeFJ407jF3QdNjLhhVt2sHNATM3EYsqwYMU6a3043NEoCw5oGmyXuurUxBk6jj0PiAKINMQJC8cjJP/1mYXZrHhaaDKxLXvTa667ZuhwbqtHEtSKrMQmyWqaPVYmZkZwnXnlNBk6i7lmf0keUaW5nMN8Aca55Z2HBsHje2+Cy1FRqMvRWaKJ8x+SFolgeW4TkWNLk6Dxo0k50NMFmTzJ+nGP26MMoeaMbR28jcD2PdDU0rtQKwvQ9tGZ4XpqmOgiZXpy3PArDQVNoAKh/cf7u9NfNIg+6ChtoS3YeywqihsVfABdn+GGiG+0p25jUATrL9qRcBqXrUiwAw3mT+JdOaewNcdN9AuQ+aJjKrzQPlBuCtebuca9Tv2dStrd/7XsoCNE34bCwMGD9+hlr2XkGTqLuWZwwPJPFlL46ubAAy1gAN3ffMbqGZ6uZkDccAruXrIhOL5LZf9bn3wcwODjQghtimqU9LA00TlWeIC5pEPfJ3mqtoBs4x924ZaHZJgOotDxdU0CTq3wjNY3UPNMdV0CSqoLlXBc2/ToegKaWroElUQXNNFTSJKmiuqYImUQXNNVXQJKqguaYKmkQdgibYqOM3SLA56e474Aae3nlfUbRZuCR4u/eIPRgpsafiJO6Tu+nKz8LtC8VVeUx5+6ay9a+gSdRxaGJT/p3Q+AJIRF/tyQWloS90CkA+K6e/CKIAp6DJ1V8JzVcJ4NR7NHugGWDo8vprrxU0ucqHhkZbXoo0wynjBXWh4eakNhfBzJ4ZRRmvfQQBplbnj6V+UrsNIFuhgWfkxfb6a68VNLnKhYaMJ/KimYTxhrrGMphHgGOhIRiGGUHGGPLw7zB+P7GdBsymTdC8j+2Z5DzbIWZBk6vHvQiYDbQZGscgExQRNGDu0ciqTgWNiTdJH39xzR7Uxf33TA9x1HOx/aXr7vNpcp7tUE9Bk6vMmSbKpwxs6gpjS1AUNNHZMNmWII/bT4IwMP2mmQaWfUE+UyfEs3UVNLk6AxptWqm/ABqIHfd9EzS9LMQRsxBrqBPbpvK1PAVNok6BJrzfDSCuu3ChSSJo/DIGJpVHgzpLguLngZhrBjbaDE0TxjewOs8O88k+13/unKpToGnylhXjNQNIE+RZgoYMruJAHmE+CxaN6tKcti0DIBRTXvP6ZAV5NkLThf219eo8LdfwnAqaRD3uRcA4Ak8AcHLNRIag1GP0clMs10QEzlTO3PdmIwJnSk5beOTH1MpD3RTHlreJ4g19hkQxFvtC1908c9sY/IImUYegOVVoIrVkyVIHZWVmyVJBk6hcaPoso2cEHKnNLPEF6iO5milpNl36/SVTBU2i0mcaMue0lEkc2e3S6ilmu0AFTaKeb3lW2qKCJlEFzTVV0CSqoLmmCppEFTTXVEGTqILmmipoEnUYGvPWa/+rWbtBSSnaTbda3GwcNwc3KdhYPCR6PuMbOOr3Wj/tW0VKtbn5BDoGjTmDFRpkSWiex+6DmHbt1SOhaYJX2PYV+tY6VvIVNIk6BI1zTAUMsnWWAD0emrs3Rh8MjRdv83MqaJ5Xh6CBL3SEZgYAR3z+k97T8kKZZR0ahIAT/dn0aPMT2uTMdnIZZ8uqJV7rj2dUswx8e5/zQPvcmHMMBckQfzx3N2kRms+CJlNHf6dRx076F6zMw2YYDTIbYxmawZBsXhcagtOO4NZ47fMHQ0XxZsicNhsAhjxwf2XGFXng0KUCaKx/+lzQPK+OQqNngZ6keSwgKDDNZHozC1EC0wyGQrkjexOeANbmBTmmZg3m7lKQBCCqPMbow+cuHhw+2r0ZAq9+Dyr9fLgvBU2qjkCDJpWjII3Akwk88zQpEy/MNIHZNXQkMpc/Y1G7hvtB+9ToviVPyyXNH0EK1+Xz8QcMSNw/U49WQZOq/dAEZleG+TpootlHiU07telx0Mi2urMXyMZa6DuroHlenQmNzaNNv2CcwDADIFBnZKxRs6n9uvUMutRPWScD0f+N2jICuAp7QfO8OvQ7zWAcNJhdnqk8YIKtoy3FM4C8fpPQ+WAqtTJRfcMSk9onrw15ep2tDdbMHYDX7719EQQjNFyfbH+vb8pT0Dyvjr4IQHC6ySipZQmbhOHBpExjTDyKwOHyLb6cqWCkFrFtwrrGGFIIBd9vs6Rj1C15PAC0HGi6zDNU5Qua59VhaBYVmOROSWjStGjmr1NBk6iCZqcKmlJBs1MFTekcaEpnq6BJVEFzTRU0iSporqmCJlEFzTVV0CSqoLmmCppE7YaGNvLkppxM8o0Zbwyqt2hU3n+zRpuRZhPSavEIynRawWxs2gR14Fu+eFPyDm3uJ/7stmHhTV1Bk6i7ZprF169khn70RUGwAMai0YQmMOizkA9UZMwTodncz4LmcjoNGrjHx074ICcKZyB9rSu6Pioye3R9wZgnals/j0BTf58mVWdBA8YQS6BxiWbL6ZEZz5ZJw2Ecdd+O4uEMFBnTtA3KtzrlmTCatdRZt2H2oLZRmurZ0M8j0PS2FDSJOgcaNAKbcVwyOUaBWBIuPWsAhDIGG5w+do31sPZAIw09w6BBiNvZ9fn+Qe3a0s+d0FC/C5pEnQKNNTR81vlcCKzhpzjdmLYeY3gy3/xZag80TjsVnDrW0A+j9X7ugEYAV9Ak6gxoxhF/HI1t2V7GMw7EamXHJRHd4+sQT888s/ZAo2OMUMhYC4ZnrfZzKzQ6X0GTqMdDg0bk9b1O0Yjdy4zwdTE0rqmEycHcDlioyJhfAM2Gfir4peTzhbbNz7KgSdTDoXGMB4K8evk0GbKXUcYkcSwXzi42PRpTxtY6C5oFwwut9XOsgxQ9l6aCJlGPhQYN5ZvIu4cj7+uCoZU5Q8P1/wTZAXXSedDwYCBj//xu27LUzy7dV5R3bVZBk6iHQuPMJlJgQDNj4PLLziIEmDIrmmgAkupcHu1PhKaL20DJ67/fTynq30ocVkGTqLugKaWpoElUQXNNFTSJKmiuqYImUQXNNVXQJKqguaYKmkQVNNdUQZOoguaaKmgSVdBcUwVNou6Gpm8IDhuL0WbikmhD02zwTbHtRiqINgRp8zE8jqJk6pFth81NcU8lrDuu40ifm8zGaLhJazZxC5pEHYdGmO+B0IRlBmiofmHgLdB8vr+JGAtHVZzTAV0PhYZAkDv/Pb53EgDrnY8LFTSJOgZNNxsa2D+weD40eCxl7cjLuvz2N30BNGHdgzC2PJha0CTq3uXZHmjQ6HPSI+p2aMC4atZBTYZWy6zR+FKnQcPleVnl9Bnq3gI5xMC2cHsLmkR9DTT4WRlkWJpshKYtr0bgUAiTbA/9zuNB0SVAHPQQaEyf4Zqoj4FaAQfq5D5QjIImUV8CjTULSRuQwOomEmmCgw3WU2AyhEYbfTS5PE08QjHpIdDYPjsDg+iXP2Bge+dBAj8XNIn6CmhCoyljOoaS4lnhB5nMmT28emKTdy3MRA+BZizvPy+K29tiyzjw9RgFTaIuB003D5Qb8+6HpknGlQpMH1637Q/yRdCgRoghP8CkU0GTqK9bno0G0obeAU0Tj8zyd5vj0OyAI4IMDC+uQ3mbb6WPTdDe6XnapRmr/uZmqi73IkCYEEdhA9IiNM2E6j61yxv5wxmF6jX1DNegvL4GbRExexkNBELCz8DmlypoEvU10HSRQbuRIPmj8HyfEpvOHeG5DF5fh6aJzczJA6ZrAZouBHYhDpdX9Y3xbBw7iETtK2gSdS80pUAr0N2rgiZRBc1JKmj+XhU0J6mg+XtV0FxTBU2iCpprqqBJVEFzTRU0iSporqmCJlEFzTVV0CTqLmhoV19uzi0dEZnyext2Tqyeps0+722UjKc2EW2iTVEbY+ENF+7Gmx17qk/v4rPkZiT+bJ8FbmTyBm10RKZpw5u3giZRR6FxTcXGMbvyLNydD/4P/2BIu+MvNBgJTecCGJluMzRk+sN/mXqEBp+X7F9Bc1kdgmZxxNXnp2ahkcK/JbMLGjJvAOfd0EBb2nX+ly53ofnHMvq6gQbqsX2+B5rb7f+0MYowJGsNigAAAABJRU5ErkJggg=="); Base64ToMultipartFile base64ToMultipartFile = new Base64ToMultipartFile(s.toString(),null); System.out.println(base64ToMultipartFile.getOriginalFilename()); } } ``` #### SpringContextUtil ##### 作用:使用静态方法从Spring容器中获取Bean对象 ```java @Component public class SpringContextUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringContextUtil.applicationContext = applicationContext; } //获取applicationContext public static ApplicationContext getApplicationContext() { return applicationContext; } //通过name获取 Bean. public static Object getBean(String name) { return getApplicationContext().getBean(name); } //通过class获取Bean. public static T getBean(Class clazz) { return getApplicationContext().getBean(clazz); } //通过name,以及Clazz返回指定的Bean public static T getBean(String name, Class clazz) { return getApplicationContext().getBean(name, clazz); } } ``` #### TransactionUtil ##### 作用:手动事务控制 ```java @Component @Scope("prototype") public class TransactionUtils { private TransactionStatus status; private final DataSourceTransactionManager dataSourceTransactionManager; public TransactionUtils(DataSourceTransactionManager dataSourceTransactionManager){ this.dataSourceTransactionManager = dataSourceTransactionManager; } //开始事务 public TransactionStatus begin() { status = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute()); return status; } //提交事务 public void commit(TransactionStatus transaction) { dataSourceTransactionManager.commit(transaction); } //回滚事务 public void rollback() { dataSourceTransactionManager.rollback(status); } } ``` #### ReflectionUtils ##### 作用:通过反射获取某个类的所有属性 ```java public class ReflectionUtils { /** * 获取某个一个类所有的属性(包括所有父类) * @param clazz 目标类 * @return 所有属性集合 */ public static List reflectForField(Class clazz) { Class tmpClazz = clazz; List fieldList = new ArrayList<>(); while (tmpClazz != null) { if (tmpClazz.equals(Object.class)) { tmpClazz = tmpClazz.getSuperclass(); continue; } fieldList.addAll(new ArrayList<>(Arrays.asList(tmpClazz.getDeclaredFields()))); tmpClazz = tmpClazz.getSuperclass(); } return fieldList; } /** * 获取某个类的某个属性(包括父类) * @param clazz 目标类 * @param filedName 属性名称 * @return 属性 */ public static Field getDeclaredField(Class clazz,String filedName){ List fieldList = reflectForField(clazz); for (int i = 0; i < fieldList.size(); i++) { if (fieldList.get(i).getName().equals(filedName)){ return fieldList.get(i); } } return null; } } ```