常用API
6、HttpClient
·1055 字·3 分钟·
loading
·
loading
Java
常用API
第三方
HttpClient # HttpClient是客户端的http通信实现库,这个类库的作用是接收和发送http报文,使用这个类库,它相比传统的 HttpURLConnection,增加了易用性和灵活性,我们对于http的操作会变得简单一些。
8、验证码
·1268 字·3 分钟·
loading
·
loading
Java
常用API
第三方
SpringBoot集成kaptcha实现数字计算验证码和字母验证码功能 # 1、Maven依赖 # <dependency> <groupId>pro.fessional</groupId> <artifactId>kaptcha</artifactId> <version>2.3.3</version> <exclusions> <exclusion> <artifactId>servlet-api</artifactId> <groupId>javax.servlet</groupId> </exclusion> </exclusions> </dependency> 2、配置类 # package top.ygang.framework.config; import java.util.Random; import com.google.code.kaptcha.text.impl.DefaultTextCreator; /** * 验证码文本生成器 * @Author: yanggang * @Date: */ public class KaptchaTextCreator extends DefaultTextCreator { private static final String[] CNUMBERS = "0,1,2,3,4,5,6,7,8,9,10".split(","); @Override public String getText() { Integer result = 0; Random random = new Random(); int x = random.nextInt(10); int y = random.nextInt(10); StringBuilder suChinese = new StringBuilder(); int randomoperands = random.nextInt(3); if (randomoperands == 0) { result = x * y; suChinese.append(CNUMBERS[x]); suChinese.append("*"); suChinese.append(CNUMBERS[y]); } else if (randomoperands == 1) { if ((x != 0) && y % x == 0) { result = y / x; suChinese.append(CNUMBERS[y]); suChinese.append("/"); suChinese.append(CNUMBERS[x]); } else { result = x + y; suChinese.append(CNUMBERS[x]); suChinese.append("+"); suChinese.append(CNUMBERS[y]); } } else { if (x >= y) { result = x - y; suChinese.append(CNUMBERS[x]); suChinese.append("-"); suChinese.append(CNUMBERS[y]); } else { result = y - x; suChinese.append(CNUMBERS[y]); suChinese.append("-"); suChinese.append(CNUMBERS[x]); } } suChinese.append("=?@" + result); return suChinese.toString(); } } package top.ygang.huijifindresource.utils.captcha; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Properties; import static com.google.code.kaptcha.Constants.*; /** * @Description: 验证码配置 * @Author: yanggang * @Date: */ @Configuration public class CaptchaConfig { /** * 字符验证码生成器 * @return */ @Bean(name = "captchaProducer") public DefaultKaptcha getKaptchaBean() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 是否有边框 默认为true 我们可以自己设置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 验证码文本字符颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); // 验证码图片宽度 默认为200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 验证码图片高度 默认为50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 验证码文本字符大小 默认为40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); // KAPTCHA_SESSION_KEY properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); // 验证码文本字符长度 默认为5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } /** * 数学验证码生成器 * @return */ @Bean(name = "captchaProducerMath") public DefaultKaptcha getKaptchaBeanMath() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 是否有边框 默认为true 我们可以自己设置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 边框颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); // 验证码文本字符颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); // 验证码图片宽度 默认为200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 验证码图片高度 默认为50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 验证码文本字符大小 默认为40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); // KAPTCHA_SESSION_KEY properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); // 验证码文本生成器 // !!注意,这里需要手动修改为上面的KaptchaTextCreator的全类名 properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "top.ygang.framework.config.KaptchaTextCreator"); // 验证码文本字符间距 默认为2 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); // 验证码文本字符长度 默认为5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); // 验证码噪点颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); // 干扰实现类 properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } } 3、工具类 # package top.ygang.huijifindresource.utils.captcha; import com.google.code.kaptcha.Producer; import lombok.Data; import org.apache.tomcat.util.codec.binary.Base64; import org.springframework.stereotype.Component; import org.springframework.util.FastByteArrayOutputStream; import javax.annotation.Resource; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException; /** * @Description: 验证码生成工具类 * @Author: yanggang * @Date: */ @Component public class CaptchaGenerateUtil { @Resource(name = "captchaProducer") private Producer captchaProducer; @Resource(name = "captchaProducerMath") private Producer captchaProducerMath; private static final String BASE64_IMG_PREFIX = "data:image/gif;base64,"; @Data public static class CodeEntity { public CodeEntity(String code,String img){ this.code = code; this.img = img; } //生成的验证码,存入缓存中,用于后续校验 private String code; //生成的图片Base64编码,用于前端展示 private String img; } /** * 生成字符验证码 * @return * @throws IOException */ public CodeEntity generateCode() throws IOException { String capStr = captchaProducer.createText(); String code = capStr; BufferedImage image = captchaProducer.createImage(capStr); // 转换流信息写出 FastByteArrayOutputStream os = new FastByteArrayOutputStream(); ImageIO.write(image, "jpg", os); return new CodeEntity(code, BASE64_IMG_PREFIX + Base64.encodeBase64String(os.toByteArray())); } /** * 生成数学验证码 * @return * @throws IOException */ public CodeEntity generateCodeMath() throws IOException { String capText = captchaProducerMath.createText(); String capStr = capText.substring(0, capText.lastIndexOf("@")); String code = capText.substring(capText.lastIndexOf("@") + 1); BufferedImage image = captchaProducerMath.createImage(capStr); // 转换流信息写出 FastByteArrayOutputStream os = new FastByteArrayOutputStream(); ImageIO.write(image, "jpg", os); return new CodeEntity(code, BASE64_IMG_PREFIX + Base64.encodeBase64String(os.toByteArray())); } }
10、加密算法
·2183 字·5 分钟·
loading
·
loading
Java
常用API
JDK原生
加密方式 # 对称加密:客户端和服务器共用同一个密钥,可以用于加密一段内容,可以用于解密这段内容。 优点:加解密效率高。 缺点:安全性方面可能存在一些问题,因为密钥存放在客户端有被窃取的风险 对称加密的代表算法有:AES、DES等。 非对称加密:它将密钥分成了两种(公钥和私钥)。公钥通常存放在客户端,私钥通常存放在服务器。使用公钥加密的数据只有用私钥才能解密,反过来使用私钥加密的数据也只有用公钥才能解密。 优点:是安全性更高,因为客户端发送给服务器的加密信息只有用服务器的私钥才能解密,因此不用担心被别人破解。 缺点:加解密的效率相比于对称加密要差很多。 非对称加密的代表算法有:RSA、ElGamal等。 哈希算法:它的作用是对任意长度的数据生成一个固定长度的唯一标识,也叫哈希值、散列值或消息摘要(后文统称为哈希值)。 优点:原始数据的任何改变都会导致哈希值的巨大变化。不能从哈希值还原出原始数据。一般用于密码的保存或者内容校验。 常见的算法有:MD5、SHA、SM3、Bcrypt等。 对称加密 # 对称加密是一种相对来说比较常用的加密方式,它的工作原理很简单:先用一个秘钥将明文加密成密文,再用相同的秘钥将密文解密成明文。其中最常见的对称加密算法有DES、3DES、AES。
5、日志系统
·6660 字·14 分钟·
loading
·
loading
Java
常用API
第三方
日志系统 # 日志文件 # 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。 在计算机中,日志文件是记录在操作系统或其他软件运行中发生的事件或在通信软件的不同用户之间的消息的文件。记录是保持日志的行为。在最简单的情况下,消息被写入单个日志文件。 许多操作系统,软件框架和程序包括日志系统。广泛使用的日志记录标准是在因特网工程任务组(IETF)RFC5424中定义的syslog。 syslog标准使专用的标准化子系统能够生成,过滤,记录和分析日志消息 调试日志 # 软件开发中,我们经常需要去调试程序,做一些信息,状态的输出便于我们查询程序的运行状况。为了让我们能够更加灵活和方便的控制这些调试的信息,所以我们需要专业的日志技术。java中寻找bug会需要重现。调试也就是debug 可以在程序运行中暂停程序运行,可以查看程序在运行中的情况。日志主要是为了更方便的去重现问题。
1、时间日期
·5444 字·11 分钟·
loading
·
loading
Java
常用API
JDK原生
java.lang.System # System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
4、String
·1980 字·4 分钟·
loading
·
loading
Java
常用API
JDK原生
java.lang.String # 概述 # String:字符串,使用一对""引起来表示。
7、FreeMarker
·2019 字·5 分钟·
loading
·
loading
Java
常用API
第三方
FreeMarker # FreeMarker 是一款免费的模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件,也可以通过模板来生成Word、pdf、Excel
8、数学
·1269 字·3 分钟·
loading
·
loading
Java
常用API
JDK原生
java.lang.Math # 提供了一系列静态方法用于科学计算。
7、比较器
·637 字·2 分钟·
loading
·
loading
Java
常用API
JDK原生
自然排序:java.lang.Comparable
定制排序:java.util.Comparator
6、UUID
·691 字·2 分钟·
loading
·
loading
Java
常用API
JDK原生
java.util.UUID # 什么是UUID # UUID是国际标准化组织(ISO)提出的一个概念。这个数值可以通过一定的算法计算出来。为了提高效率,常用的UUID可缩短至16位。UUID用来识别属性类型,在所有空间和时间上被视为唯一的标识。一般来说,可以保证这个值是真正唯一的任何地方产生的任意一个UUID都不会有相同的值。UUID是基于当前时间、计数器(counter)和硬件标识(通常为无线网卡的MAC地址)等数据计算生成的。