跳过正文

Java

5、常用插件
·2079 字·5 分钟· loading · loading
Java JavaEE Maven
maven-jar-plugin # 默认maven打包的结果没有指定mainClass,所以使用java -jar命令会显示xxx.jar中没有主清单属性,使用此插件可以指定mainClass
3、Maven依赖
·1061 字·3 分钟· loading · loading
Java SpringFramework SpringBoot
Parent # <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> </parent> 常用依赖 # Web场景启动器 # <!-- Web场景启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> 单元测试 # <!-- 单元测试 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <!-- JUnit Vintage是为了兼容3和4的一个engine,排除 --> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> Mybatis场景启动器 # <!-- Mybatis场景启动器 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> Mbatis-Plus场景启动器 # <!-- Mbatis-Plus场景启动器 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.0</version> </dependency> MySQL # <!-- MySQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.15</version> </dependency> Oracle # <!-- Oracle --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.3</version> </dependency> Druid场景启动器 # <!-- Druid连接池场景启动器 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency> Lombok # <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> </dependency> Redis场景启动器 # <!-- Redis场景启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> Thymeleaf场景启动器 # <!-- Thymeleaf场景启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> JSP解析器 # <!-- jsp依赖 --> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> Fileupload文件上传组件 # <!-- Fileupload文件上传组件 --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> fastjson # <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.7</version> </dependency> pagehelper分页插件 # <!-- pagehelper分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> AOP # <!-- AOP --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </dependency> Shiro # <!-- Shiro --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-ehcache</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-all</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.2.2</version> </dependency> POI # <!-- POI --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>4.1.2</version> </dependency> Hutool # <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.8</version> </dependency> SpringBoot打包插件 # spring-boot-maven-plugin是Spring Boot提供的maven打包插件。可以将项目直接打包为可运行的jar包或war包。
6、HttpClient
·1055 字·3 分钟· loading · loading
Java 常用API 第三方
HttpClient # HttpClient是客户端的http通信实现库,这个类库的作用是接收和发送http报文,使用这个类库,它相比传统的 HttpURLConnection,增加了易用性和灵活性,我们对于http的操作会变得简单一些。
2、Thymeleaf
·3672 字·8 分钟· loading · loading
Java SpringFramework SpringBoot
JSP的缺陷 # JSP就是一个Servlet ,生命周期:翻译,编译,加载,初始化,服务,销毁 Servlet一定要放置在Servlet容器中才可以运行,浏览器不能直接解析 JSP页面一般构成:HTML + CSS + JS + Java代码 + JSTL标记 由此的坏处: JSP必须要在Servlet容器解析成HTML,才可以返回到浏览器中(系统:不管是静态请求也好, 还是动态请求,都压到Tomcat服务器,这就可能导致Tomcat解决动态请求的能力有所降低) JSP必须要在Servlet容器解析成HTML,这就意味着百度,谷歌,以及其他的搜索引擎无法去收录 JSP从2015年之前,就开始走向灭亡,取而代之的是,HTML + 模板引擎 模板引擎 # 使用符号或者自定义标记 + 网页中不变的东西 = 模板引擎 模板引擎的作用: 将页面中动态的内容,使用标记或某些符号,进行静态的替换。从而做到:浏览器认为整个网页都是静态的内容(进而可以做到:浏览器缓存HTML,Nginx等服务器缓存HTML) 从而提升系统的整合响应性能 常见的模板引擎**:Freemarker,thymeleaf,velocity** Thymeleaf的特点 # Thymeleaf 模板引擎具有以下特点:
8、注解
·2676 字·6 分钟· loading · loading
Java JavaSE JavaSE高级
什么是注解 # 注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。
3、Jedis与RedisTemplate
·5571 字·12 分钟· loading · loading
Java 组件与中间件 Redis
Jedis # 使用步骤(Maven下使用) # 1、pom.xml文件中导入依赖 # <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.3.0</version> </dependency> 2、获取Redis对象,连接Redis # //无参构造为默认ip:127.0.0.1,端口号:6379 Jedis jedis = new Jedis("127.0.0.1",6379); 对于String类型的操作 # Jedis jedis = new Jedis(); //清空所有数据库 jedis.flushAll(); for (int i = 0; i < 10; i++) { //insert jedis.set("key" + i,"value" + i); } //delete jedis.del("key2"); //update jedis.set("key1","vvvvv"); //findById String s = jedis.get("key1"); System.out.println(s); //findAll Set<String> keys = jedis.keys("*"); Iterator<String> iterator = keys.iterator(); while (iterator.hasNext()){ String key = iterator.next(); String value = jedis.get(key); System.out.println("key:" + key + "value:" + value); } 对于Set类型的操作 # Jedis jedis = new Jedis(); jedis.flushAll(); //insert jedis.sadd("person","lucy1"); jedis.sadd("person","lucy2"); jedis.sadd("person","lucy3"); jedis.sadd("person","lucy4"); jedis.sadd("person","lucy5"); //查询key的数据量 System.out.println(jedis.scard("person")); //delete jedis.srem("person","lucy1"); //findAll Set<String> person = jedis.smembers("person"); System.out.println(person); 对于Zset类型的操作 # Jedis jedis = new Jedis(); jedis.flushAll(); //insert,可以根据第二个参数值,进行排序 jedis.zadd("person",18,"lucy18"); jedis.zadd("person",9,"lucy9"); jedis.zadd("person",26,"lucy26"); jedis.zadd("person",4,"lucy4"); //delete jedis.zrem("person","lucy9"); //查看key的数据量 System.out.println(jedis.zcard("person")); //findAll Set<String> person = jedis.zrange("person", 0, -1); System.out.println(person); 对于List类型的操作 # Jedis jedis = new Jedis(); jedis.flushAll(); for (int i = 0; i < 10; i++) { //在后面添加 jedis.rpush("key","value" + i); } for (int i = 11; i < 20; i++) { //在前面添加 jedis.lpush("key","value" + i); } //findById System.out.println(jedis.lindex("key", 3)); //delete jedis.lrem("key",1,"value1"); //update jedis.lset("key",3,"vvvvv"); //findAll List<String> key = jedis.lrange("key", 0, -1); System.out.println(key); //统计该key对应的value数量 System.out.println(jedis.llen("key")); 对于Hash类型的操作 # Jedis jedis = new Jedis(); jedis.flushAll(); //insert jedis.hset("person","name","lucy"); jedis.hset("person","sex","nv"); jedis.hset("person","age","18"); //update jedis.hset("person","age","25"); //根据id获取值 System.out.println(jedis.hget("person", "age")); //delete jedis.hdel("person","sex"); //findAll Map<String, String> map = jedis.hgetAll("person"); System.out.println(map); spring-boot-starter-data-redis # 使用步骤 # 1、导入依赖
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())); } }
1、Redis
·1710 字·4 分钟· loading · loading
Java 组件与中间件 Redis
数据库概述 # 数据库分为关系型数据库,非关系型数据库
10、加密算法
·2183 字·5 分钟· loading · loading
Java 常用API JDK原生
加密方式 # 对称加密:客户端和服务器共用同一个密钥,可以用于加密一段内容,可以用于解密这段内容。 优点:加解密效率高。 缺点:安全性方面可能存在一些问题,因为密钥存放在客户端有被窃取的风险 对称加密的代表算法有:AES、DES等。 非对称加密:它将密钥分成了两种(公钥和私钥)。公钥通常存放在客户端,私钥通常存放在服务器。使用公钥加密的数据只有用私钥才能解密,反过来使用私钥加密的数据也只有用公钥才能解密。 优点:是安全性更高,因为客户端发送给服务器的加密信息只有用服务器的私钥才能解密,因此不用担心被别人破解。 缺点:加解密的效率相比于对称加密要差很多。 非对称加密的代表算法有:RSA、ElGamal等。 哈希算法:它的作用是对任意长度的数据生成一个固定长度的唯一标识,也叫哈希值、散列值或消息摘要(后文统称为哈希值)。 优点:原始数据的任何改变都会导致哈希值的巨大变化。不能从哈希值还原出原始数据。一般用于密码的保存或者内容校验。 常见的算法有:MD5、SHA、SM3、Bcrypt等。 对称加密 # 对称加密是一种相对来说比较常用的加密方式,它的工作原理很简单:先用一个秘钥将明文加密成密文,再用相同的秘钥将密文解密成明文。其中最常见的对称加密算法有DES、3DES、AES。
5、跨域处理CORS
·480 字·1 分钟· loading · loading
Java SpringFramework SpringBoot
要解决的问题 #