目录
1 SpringBoot配置文件
2 配置文件的快速入手
3 配置文件格式
4 properties配置文件说明
4.1 properties基本语法
4.2 读取配置文件
4.3 properties缺点
5 yml配置文件
5.1 yml基本语法
5.2 yml配置不同数据类型及null
5.3 配置对象
5.4 配置集合
5.5 配置Map
5.6 yml优缺点
6 综合性练习
6.1 验证码案例
6.2 Kaptcha插件
6.2.1 原理
6.2.2 引入依赖
6.2.3 生成验证码
6.3 页面生成验证码
6.3.1 准备工作
6.3.2 约定前后端交互接口
6.3.3 实现服务器端代码
6.3.4 调整前端代码
6.3.5 运行测试
7 总结
1 SpringBoot配置文件
配置文件主要是为了解决硬编码带来的问题,把可能会发生改变的信息,放在一个集中的地方,当我们启动某个程序时,应用程序从配置文件中读取数据并进行加载
SpringBoot支持并定义了配置文件的格式,也在另一个层面达到了规范其他框架集成到SpringBoot的目的,很多项目或者框架的配置信息也放在配置文件中,例如:
1)项目的启动端口
2)数据库的连接信息
3)第三方系统的调用密钥等信息
4)用于发现和定位问题的普通日志和异常日志等
2 配置文件的快速入手
Tomcat的默认端口是8080,所以在程序访问时的端口号也是8080,如果8080端口被占用了,则可以通过配置文件来修改服务的端口号,SpringBoot在创建项目时,就已经创建了配置文件
server.port=9090
只需要修改application.properties文件即可,重新运行程序,观察日志
此时Tomcat启动端口为9090,因此访问的时候就需要使用9090这个端口来访问
3 配置文件格式
SpringBoot配置文件有三种:
1)application.properties
2)application.yml
3)application.yaml
yml为yaml的简写,实际开发中出现的频率最高,它们使用方式一样,因此只介绍yml文件的使用
特殊说明:
1)理论上.properties和.yml可以并存于一个项目中,当.properties和.yml并存时,两个配置都会加载,如果配置文件内容有冲突,则以.properties为主,因此.properties优先级更高
2)在实际业务中,通常采用一种统一的配置文件格式
4 properties配置文件说明
properties配置⽂件是最早期的配置⽂件格式,也是创建SpringBoot项⽬默认的配置⽂件
4.1 properties基本语法
properties是以键值的形式配置的,key和value之间以"="连接,例如:
4.2 读取配置文件
如果在项目中,想要主动读取配置文件的内容,可以使用@Value注解来实现,@Value注解使用"${ }"格式读取,代码如下:
properties配置如下:
mykey.key=123
@RestController
public class PropertiesController {@Value("${mykey.key}")private String k;@RequestMapping("/key")public String key() {return "读取的值:"+ k;}
}
如果去掉$,就会把" "中的值赋值给当前变量
4.3 properties缺点
properties配置是以key-value的形式配置的,配置文件中有很多冗余信息
要解决这个问题,就可以使用yml配置文件的格式了
5 yml配置文件
yml是YAML的缩写,它的全称Yet Another Markup Language
5.1 yml基本语法
yml是树形结构的配置文件,它的基础语法是"key:value",其中key和value之间使用英文冒号加空格的方式组成,空格不可以省略
yml连接数据库代码展示
5.2 yml配置不同数据类型及null
yml配置读取的方式和properties相同,使用@Value注解即可,实现代码如下
@RestController
public class PropertiesController {@Value("${string.key1}")private String k1;@Value("${string.key2}")private Integer k2;@Value("${string.key3}")private String k3;@PostConstructpublic void init() {System.out.println("key1:" + k1);System.out.println("key2:" + k2);System.out.println("key3:" + k3);System.out.println(StringUtils.hasLength(k3));}
}
注意事项:value值加单双引号
string:str1: Hello \n Spring Boot.str2: 'Hello \n Spring Boot.'str3: "Hello \n Spring Boot."
@RestController
public class PropertiesController {@Value("${string.str1}")private String str1;@Value("${string.str2}")private String str2;@Value("${string.str3}")private String str3;//@PostConstruct是在tomcat启动之前就打印@PostConstructpublic void init() {System.out.println("str1:" + str1);System.out.println("str2:" + str2);System.out.println("str3:" + str3);}
}
从上述结果可以看出:
1)字符串默认不用加上单引号或者双引号
2)单引号会转译特殊字符,始终是一个普通字符串
3)双引号不会转义字符串里面的特殊字符,特殊字符会表示本身的含义
5.3 配置对象
student:id: 18name: zhangsanage: 19
@Component
@ConfigurationProperties(prefix = "student")
@Data
public class Student {private Integer id;private String name;private Integer age;
}
@RestController
public class StudentController {@Autowiredpublic Student student;@PostConstructpublic void init() {System.out.println("student:" + student);}
}
使用 @ConfigurationProperties来进行读取即可
5.4 配置集合
dbtype:name:-mysql-sqlserver-db2
@Component
@ConfigurationProperties(prefix = "dbtype")
@Data
public class DBType {private String[] name;
}
@RestController
public class DBTypeController {@Autowiredprivate DBType dbType;@PostConstructpublic void init() {System.out.println("dbtype:" + dbType + "length:" + dbType.getName().length);}
}
上述输出的长度为1,是因为yml里面的-和mysql之间没有加空格
dbtype:name:- mysql- sqlserver- db2
5.5 配置Map
maptype:map:k1: 1k2: 2k3: 3
@Component
@ConfigurationProperties(prefix = "maptype")
@Data
public class Map {private HashMap<String,String> map;
}
@RestController
public class MapController {@Autowiredprivate Map map;@PostConstructpublic void init() {System.out.println("map:" + map + "length:" + map.getMap().size());}
}
5.6 yml优缺点
优点:
1 可读性高,写法简单,易于理解
2 支持更多的数据类型,可以简单表达对象,数组,List,Map等数据形态
3 支持更多的编程语言,不止在Java中可以使用,在Golang,Python中也可以使用
缺点:
1 不适合写复杂的配置文件
2 对格式有较强的要求(少写一个空格就会出错)
6 综合性练习
6.1 验证码案例
随着安全性的要求越来越高,在目前项目中都使用了验证码,而验证码的形式也是各种各样的
6.2 Kaptcha插件
6.2.1 原理
验证码可以客户端生成,也可以服务器生成,对于普通的字符验证码,后端代码通常分成两部分,一是生成验证码内容,根据验证码内容和干扰项等,生成图片并返回给客户端,二是把验证码内容存储起来,校验时取出来进行对比,kaptcha插件选择把验证码存储在Session⾥
6.2.2 引入依赖
<dependency><groupId>com.oopsguy.kaptcha</groupId><artifactId>kaptcha-spring-boot-starter</artifactId><version>1.0.0-beta-2</version>
</dependency>
6.2.3 生成验证码
通过配置文件生成验证码
kaptcha:items:home:path: /home/captchasession:key: HOME_KAPTCHA_SESSION_KEYdate: HOME_KAPTCHA_SESSION_DATEadmin:path: /admin/captchasession:key: ADMIN_KAPTCHA_SESSION_KEYdate: ADMIN_KAPTCHA_SESSION_DATE
直接通过http://127.0.0.1:8080/home/captcha访问即可
6.3 页面生成验证码
6.3.1 准备工作
创建项目,引入SpringMVC的依赖包,把前端页面放在项目中
6.3.2 约定前后端交互接口
需求分析
1)后端生成验证码并返回给前端
2)校验验证码受否正确
接口定义
1)生成验证码
请求:GET /admin/captcha
响应:图片内容
2)校验验证码是否正确
请求:POST /admin/check
响应:true
6.3.3 实现服务器端代码
引入依赖
<dependency><groupId>com.oopsguy.kaptcha</groupId><artifactId>kaptcha-spring-boot-starter</artifactId><version>1.0.0-beta-2</version>
</dependency>
通过配置文件创建验证码生成器
kaptcha:items:admin:path: /admin/captchasession:key: ADMIN_KAPTCHA_SESSION_KEYdate: ADMIN_KAPTCHA_SESSION_DATE
验证码检验
@RequestMapping("/admin")
@RestController
public class CaptchaController {private static final String SESSION_KEY = "ADMIN_KAPTCHA_SESSION_KEY";private static final String SESSION_DATE ="ADMIN_KAPTCHA_SESSION_DATE";private static final Long SESSION_TIME = 60 * 1000L;@RequestMapping("/check")public Boolean check(String captcha, HttpSession session) {if (!StringUtils.hasLength(captcha)) {return false;}//从Session中获取验证码String saveCaptcha = (String)session.getAttribute(SESSION_KEY);Date saveDate = (Date) session.getAttribute(SESSION_DATE);//对比验证码if (captcha.equals(saveCaptcha)) {//对比日期if (saveDate == null || System.currentTimeMillis() - saveDate.getTime() < SESSION_TIME) {return true;}}return false;}
}
对比Session中存储的验证码是否和用户输入的一致,如果一致,并且试件在一分钟就认为成功
6.3.4 调整前端代码
$("#checkCaptcha").click(function () {$.ajax({url: "/admin/check",type: "post",data: {captcha: $("#inputCaptcha").val()},success: function (result) {if (result) {location.href = "success.html";} else {alert("验证码错误");}}});});
6.3.5 运行测试
7 总结
1)properties是以key=value的形式配置的键值类型的配置文件,yml使用的是树形配置方式
2)读取配置文件内容,使⽤@Value注解,注解内使用" ${} "的格式读取
3)yml层级之间使用换行缩进的方式配置,key和value之间使⽤":"(英⽂冒号)加空格的方式设置,并且空格不可省略
4)yml可以很好的解决数据冗余的问题,但不适合复杂设置
5)yml和properties可以共存,但是项目中建议使用一种配置类型文件