1. 配置文件引入
配置文件最重要的作用: 解决硬编码的问题
下面修改端口看一下:
2. 配置文件格式
Spring Boot 配置⽂件有以下三种:
- application.properties
- application.yml
- application.yaml(yml的简写)
说明:
- 当两个文件并存时,两个配置都会加载.
- 如果配置⽂件内容有冲突,则以 properties 优先级更⾼.
- 虽然理论上来讲 .properties 可以和 yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置⽂件格式,这样可以更好的维护(降低故障率).
3. properties 配置⽂件说明
3.1 基本语法
key value的形式,以"="分割
key的格式建议小写,单词之间使用.分割
3.2 读取配置⽂件@Value
@Value 注解使⽤" ${} "的格式读取
如果去掉#呢?
3.3 properties 缺点
从上述配置key看出,properties配置⽂件中会有很多的冗余的信息
4. yml配置⽂件说明
4.1 基本语法
yml是树形结构的配置⽂件,它的基础语法是"key:value".
key和value之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略.
那假如把空格省略呢?
4.2 yml使⽤进阶
4.2.1 配置读取
读取方法与properties方式一样
4.2.2 yml配置不同数据类型及null
4.2.2.1 null
使用~
4.2.2.2 空字符串
key后面直接空着就可以,或者获取单双引号括起来(更推荐)
4.2.2.3 单双引号转义区别
- \n本身表示的是换行
- 使用单引号时,内容表示成了\你,而不是换行,所以认为是转义
- 使用双引号时,\n表示了换行,也就是\n的本来含义
4.2.3 配置对象
配置文件:
配置内容读取:
注入:
此时就可以读取了:
4.2.4 配置集合/数组
配置文件:
(-空格)
配置内容读取:
注入:
打印:
注意:
如果-后面不加空格
此时用数组接收一下:
此时会将这些字符串作为一个整体去接收
4.2.5 配置Map
4.3 优缺点
优点:
- 可读性⾼,写法简单, 易于理解
- ⽀持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态
- ⽀持更多的编程语⾔,不⽌是Java中可以使⽤,在Golang,Python,Ruby,JavaScript中也可以使⽤
缺点:
- 不适合写复杂的配置⽂件
- 对格式有较强的要求(⼀个空格可能会引起⼀场⾎案)
5. 案例(验证码实现)
5.1 Kaptcha 插件介绍
5.1.1 原理
客户端和服务端都可以生成
1.生成内容(根据词库)
2.生成干扰项
3.两者组成一个图片返回
5.1.2 引⼊依赖
<dependency>
<groupId>com.oopsguy.kaptcha</groupId>
<artifactId>kaptcha-spring-boot-starter</artifactId>
<version>1.0.0-beta-2</version>
</dependency>
5.1.3 ⽣成验证码
配置文件:
kaptcha:
items:
# home captcha
home:
path: /home/captcha
session:
key: HOME_KAPTCHA_SESSION_KEY
date: HOME_KAPTCHA_SESSION_DATE
# admin captcha
admin:
path: /admin/captcha
session:
key: ADMIN_KAPTCHA_SESSION_KEY
date: ADMIN_KAPTCHA_SESSION_DATE
直接启动:
也可以加一些配置项
比如:图片大小:
字体大小:
5.2 需求
1. ⻚⾯⽣成验证码
2. 输⼊验证码,点击提交,验证⽤⼾输⼊验证码是否正确,正确则进⾏⻚⾯跳转
5.3 校验
请求:/admin/check
@RequestMapping("/admin")
@RestController
public class CaptchaController {
//企业标准(建议):
//常量定义: key: 全部大写, 单词之间使用下划线分割 value: 通常是小写, 以下划线分割
private static final String KAPTCHA_SESSION_KEY = "ADMIN_KAPTCHA_SESSION_KEY";
private static final String KAPTCHA_SESSION_DATE = "ADMIN_KAPTCHA_SESSION_DATE";
//验证码的有效时间:ms
private static final Long SESSION_TIMEOUT = 60 * 1000L;
//验证成功: true
//验证失败: false
/**
* 1. 从Session中获取到生成的验证码
* 2. 比对前端传递的验证码和Session中存储的是否一样
*/
@RequestMapping("/check")
public Boolean check(String captcha, HttpSession session){
if (!StringUtils.hasLength(captcha)){
return false;
}
//从Session中获取验证码
String saveCaptcha = (String)session.getAttribute(KAPTCHA_SESSION_KEY);
Date saveDate = (Date)session.getAttribute(KAPTCHA_SESSION_DATE);
//比对验证码
if (captcha.equals(saveCaptcha)){
//比对日期
if (saveDate==null || System.currentTimeMillis() - saveDate.getTime()< SESSION_TIMEOUT){
return true;
}
}
return false;
}
}
返回:true/false
输入验证码,跳转成功